From a83d81099a401dff4a9ad9da06cd83c51d721e90 Mon Sep 17 00:00:00 2001 From: Tomasz Kopacki Date: Tue, 26 May 2026 18:35:57 +0200 Subject: [PATCH 01/13] Update docs for Unigraph examples --- .../molecules/EnsDbReaderIntro.astro | 9 ++ .../molecules/EnsIndexerSchemaIntro.astro | 22 ++++ .../molecules/EnsNodeSchemaIntro.astro | 14 ++ .../components/molecules/ResultDetails.astro | 8 ++ .../unigraph/examples/account-domains.mdx | 15 +++ .../unigraph/examples/domain-by-name.mdx | 71 ++++++++++ .../integrate/unigraph/examples/index.mdx | 8 +- .../unigraph/examples/indexing-status.mdx | 122 +++++++++++++++++- 8 files changed, 262 insertions(+), 7 deletions(-) create mode 100644 docs/ensnode.io/src/components/molecules/EnsDbReaderIntro.astro create mode 100644 docs/ensnode.io/src/components/molecules/EnsIndexerSchemaIntro.astro create mode 100644 docs/ensnode.io/src/components/molecules/EnsNodeSchemaIntro.astro create mode 100644 docs/ensnode.io/src/components/molecules/ResultDetails.astro diff --git a/docs/ensnode.io/src/components/molecules/EnsDbReaderIntro.astro b/docs/ensnode.io/src/components/molecules/EnsDbReaderIntro.astro new file mode 100644 index 000000000..001a59d39 --- /dev/null +++ b/docs/ensnode.io/src/components/molecules/EnsDbReaderIntro.astro @@ -0,0 +1,9 @@ +--- +import { Aside } from "@astrojs/starlight/components"; +--- + + diff --git a/docs/ensnode.io/src/components/molecules/EnsIndexerSchemaIntro.astro b/docs/ensnode.io/src/components/molecules/EnsIndexerSchemaIntro.astro new file mode 100644 index 000000000..ed43de0d1 --- /dev/null +++ b/docs/ensnode.io/src/components/molecules/EnsIndexerSchemaIntro.astro @@ -0,0 +1,22 @@ +--- +import { Aside } from "@astrojs/starlight/components"; + +const { ensIndexerSchemaName = "ensindexer_0" } = Astro.props; +--- + + diff --git a/docs/ensnode.io/src/components/molecules/EnsNodeSchemaIntro.astro b/docs/ensnode.io/src/components/molecules/EnsNodeSchemaIntro.astro new file mode 100644 index 000000000..83c5e3fe6 --- /dev/null +++ b/docs/ensnode.io/src/components/molecules/EnsNodeSchemaIntro.astro @@ -0,0 +1,14 @@ +--- +import { Aside } from "@astrojs/starlight/components"; + +const ensNodeSchemaName = "ensnode"; +--- + + diff --git a/docs/ensnode.io/src/components/molecules/ResultDetails.astro b/docs/ensnode.io/src/components/molecules/ResultDetails.astro new file mode 100644 index 000000000..ce77a5e58 --- /dev/null +++ b/docs/ensnode.io/src/components/molecules/ResultDetails.astro @@ -0,0 +1,8 @@ +--- +const { value, title = "Result" } = Astro.props; +--- + +
+ {title} +
{JSON.stringify(value, null, 2)}
+
diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/account-domains.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/account-domains.mdx index 6367e19a8..06752ece3 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/account-domains.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/account-domains.mdx @@ -6,6 +6,16 @@ sidebar: --- import { Tabs, TabItem } from "@astrojs/starlight/components"; +import ResultDetails from "../../../../../../components/molecules/ResultDetails.astro"; +import EnsIndexerSchemaIntro from "../../../../../../components/molecules/EnsIndexerSchemaIntro.astro"; +import EnsDbReaderIntro from "../../../../../../components/molecules/EnsDbReaderIntro.astro"; + +export const resultJson = [ + { + type: "ENSv1Domain", + count: 454, + }, +]; :::caution[`unigraph` plugin required] Using the Unigraph SQL requires that you have the `unigraph` plugin activated in your ENSNode instance. [Learn more](/docs/services/ensindexer/usage/configuration) @@ -15,13 +25,16 @@ Count the Domains owned by an address, grouped by Domain `type` (`ENSv1Domain` v + ```sql SELECT type, count(*) FROM ensindexer_0.domains WHERE owner_id = '0xd8da6bf26964af9d7eed9e03e53415d37aa96045' GROUP BY type; ``` + + ```typescript import { count, eq } from 'drizzle-orm'; @@ -32,6 +45,8 @@ const counts = await ensDb .groupBy(ensIndexerSchema.domain.type); ``` + + ``` diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-by-name.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-by-name.mdx index c7bc64382..7fbf0f5c0 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-by-name.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-by-name.mdx @@ -6,6 +6,65 @@ sidebar: --- import { Tabs, TabItem } from "@astrojs/starlight/components"; +import ResultDetails from "../../../../../../components/molecules/ResultDetails.astro"; +import EnsIndexerSchemaIntro from "../../../../../../components/molecules/EnsIndexerSchemaIntro.astro"; +import EnsDbReaderIntro from "../../../../../../components/molecules/EnsDbReaderIntro.astro"; + +export const unigraphSqlResultJson = [ + { + id: "1-0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e-0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835", + type: "ENSv1Domain", + registry_id: + "1-0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e-0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae", + subregistry_id: + "1-0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e-0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835", + token_id: null, + node: "0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835", + label_hash: "0xaf2caa1c2ca1d027f1ac823b529d0a67cd144264b2789fa2ea4d63a67c7103cc", + owner_id: "0x220866b1a2219f40e72f5c628b65d54268ca3a9d", + root_registry_owner_id: "0xd8da6bf26964af9d7eed9e03e53415d37aa96045", + canonical: true, + canonical_name: "vitalik.eth", + canonical_label_hash_path: [ + "0x4f5b812789fc606be1b3b16908db13fc7a9adf7ca72641f84d75b47069d3d7f0", + "0xaf2caa1c2ca1d027f1ac823b529d0a67cd144264b2789fa2ea4d63a67c7103cc", + ], + canonical_path: [ + "1-0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e-0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae", + "1-0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e-0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835", + ], + canonical_depth: 2, + canonical_node: "0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835", + }, +]; + +export const ensDbSdkResultJson = [ + { + id: "1-0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e-0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835", + type: "ENSv1Domain", + registryId: + "1-0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e-0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae", + subregistryId: + "1-0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e-0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835", + tokenId: null, + node: "0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835", + labelHash: "0xaf2caa1c2ca1d027f1ac823b529d0a67cd144264b2789fa2ea4d63a67c7103cc", + ownerId: "0x220866b1a2219f40e72f5c628b65d54268ca3a9d", + rootRegistryOwnerId: "0xd8da6bf26964af9d7eed9e03e53415d37aa96045", + canonical: true, + canonicalName: "vitalik.eth", + canonicalLabelHashPath: [ + "0x4f5b812789fc606be1b3b16908db13fc7a9adf7ca72641f84d75b47069d3d7f0", + "0xaf2caa1c2ca1d027f1ac823b529d0a67cd144264b2789fa2ea4d63a67c7103cc", + ], + canonicalPath: [ + "1-0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e-0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae", + "1-0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e-0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835", + ], + canonicalDepth: 2, + canonicalNode: "0xee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835", + }, +]; :::caution[`unigraph` plugin required] Using the Unigraph SQL requires that you have the `unigraph` plugin activated in your ENSNode instance. [Learn more](/docs/services/ensindexer/usage/configuration) @@ -13,14 +72,21 @@ Using the Unigraph SQL requires that you have the `unigraph` plugin activated in Fetch a Domain by its canonical name. Because `canonical_name` is materialized across both ENSv1 and ENSv2, the same lookup works regardless of protocol version. See [Connect](/docs/integrate/unigraph/examples) for setup. +:::note[Canonical fields] +Canonical fields (`canonical_name`, `canonical_path`, `canonical_node`, `canonical_depth`) are populated on every Domain reachable from the canonical root, across both ENSv1 and ENSv2 — query them uniformly without branching by `type`. +::: + + ```sql SELECT * FROM ensindexer_0.domains WHERE canonical_name = 'vitalik.eth'; ``` + + ```typescript import { eq } from 'drizzle-orm'; @@ -29,7 +95,12 @@ const [vitalik] = await ensDb .from(ensIndexerSchema.domain) .where(eq(ensIndexerSchema.domain.canonicalName, "vitalik.eth")); +console.log(vitalik); + ``` + + + ``` diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/index.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/index.mdx index 9e26f897a..a11557091 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/index.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/index.mdx @@ -38,6 +38,10 @@ FROM ensnode.metadata; npm install @ensnode/ensdb-sdk ``` +:::note[ENSDb Reader] +The `EnsDbReader` object enables you to build custom queries against the Unigraph data model in ENSDb. Use the `ensDb` field to build queries with the Drizzle ORM, and the `ensIndexerSchema` field to reference database objects (i.e. the Unigraph tables) within the [ENSIndexer Schema](/docs/services/ensdb/concepts/glossary#ensindexer-schema) in a type-safe way. +::: + ```typescript import { EnsDbReader } from "@ensnode/ensdb-sdk"; @@ -49,10 +53,6 @@ const { ensDb, ensIndexerSchema } = ensDbReader; -:::note[Canonical fields] -Canonical fields (`canonical_name`, `canonical_path`, `canonical_node`, `canonical_depth`) are populated on every Domain reachable from the canonical root, across both ENSv1 and ENSv2 — query them uniformly without branching by `type`. -::: - ## Examples diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/indexing-status.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/indexing-status.mdx index e6525f8ba..43aee13bd 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/indexing-status.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/indexing-status.mdx @@ -6,6 +6,117 @@ sidebar: --- import { Tabs, TabItem } from "@astrojs/starlight/components"; +import ResultDetails from "../../../../../../components/molecules/ResultDetails.astro"; +import EnsNodeSchemaIntro from "../../../../../../components/molecules/EnsNodeSchemaIntro.astro"; +import EnsDbReaderIntro from "../../../../../../components/molecules/EnsDbReaderIntro.astro"; + +export const ensDbSdkResultJson = { + strategy: "omnichain", + snapshotTime: 1779795066, + omnichainSnapshot: { + chains: { + 1: { + config: { + rangeType: "left-bounded", + startBlock: { + number: 3327417, + timestamp: 1489165544, + }, + }, + chainStatus: "chain-backfill", + backfillEndBlock: { + number: 25171597, + timestamp: 1779703391, + }, + latestIndexedBlock: { + number: 21224717, + timestamp: 1732054691, + }, + }, + 10: { + config: { + rangeType: "left-bounded", + startBlock: { + number: 110393959, + timestamp: 1696386695, + }, + }, + chainStatus: "chain-backfill", + backfillEndBlock: { + number: 152052671, + timestamp: 1779704119, + }, + latestIndexedBlock: { + number: 128226309, + timestamp: 1732051395, + }, + }, + 8453: { + config: { + rangeType: "left-bounded", + startBlock: { + number: 17522624, + timestamp: 1721834595, + }, + }, + chainStatus: "chain-backfill", + backfillEndBlock: { + number: 46457386, + timestamp: 1779704119, + }, + latestIndexedBlock: { + number: 22632818, + timestamp: 1732054983, + }, + }, + 42161: { + config: { + rangeType: "left-bounded", + startBlock: { + number: 349263357, + timestamp: 1750406457, + }, + }, + chainStatus: "chain-queued", + }, + 59144: { + config: { + rangeType: "left-bounded", + startBlock: { + number: 6682888, + timestamp: 1720768992, + }, + }, + chainStatus: "chain-backfill", + backfillEndBlock: { + number: 30774477, + timestamp: 1779703911, + }, + latestIndexedBlock: { + number: 12280006, + timestamp: 1732054967, + }, + }, + 534352: { + config: { + rangeType: "left-bounded", + startBlock: { + number: 16604272, + timestamp: 1750406415, + }, + }, + chainStatus: "chain-queued", + }, + }, + omnichainStatus: "omnichain-backfill", + omnichainIndexingCursor: 1732054983, + }, + slowestChainIndexingCursor: 1732054983, +}; + +export const unigraphSqlResultJson = { + indexing_status_snapshot: ensDbSdkResultJson, +}; :::caution[`unigraph` plugin required] Using the Unigraph SQL requires that you have the `unigraph` plugin activated in your ENSNode instance. [Learn more](/docs/services/ensindexer/usage/configuration) @@ -15,24 +126,29 @@ Read the indexing status snapshot for an ENSIndexer instance from the shared `en + ```sql -- Indexing status snapshot for the `ensindexer_0` ENSIndexer Schema -SELECT value -> 'indexingStatus' FROM "ensnode"."metadata" +SELECT value -> 'indexingStatus' as indexing_status_snapshot +FROM "ensnode"."metadata" WHERE ens_indexer_schema_name = 'ensindexer_0' AND key = 'indexing_metadata_context'; ``` + + ```typescript import { IndexingMetadataContextStatusCodes } from '@ensnode/ensdb-sdk'; const indexingMetadataContext = await ensDbReader.getIndexingMetadataContext(); if (indexingMetadataContext.statusCode === IndexingMetadataContextStatusCodes.Initialized) { const indexingStatusSnapshot = indexingMetadataContext.indexingStatus; -// Do something with the indexing status snapshot +console.log(indexingStatusSnapshot, null, 2); } ``` - + + ``` From 5ab3e682ca4ad3623d1a6d4680f067d8381fddf2 Mon Sep 17 00:00:00 2001 From: Tomasz Kopacki Date: Tue, 26 May 2026 19:08:38 +0200 Subject: [PATCH 02/13] Apply AI PR feedback --- .../molecules/EnsDbReaderIntro.astro | 4 +++- .../molecules/EnsNodeSchemaIntro.astro | 4 ++-- .../unigraph/examples/account-domains.mdx | 19 +++++++++++-------- .../unigraph/examples/domain-by-name.mdx | 16 +++++++++------- .../unigraph/examples/indexing-status.mdx | 18 +++++++++++------- 5 files changed, 36 insertions(+), 25 deletions(-) diff --git a/docs/ensnode.io/src/components/molecules/EnsDbReaderIntro.astro b/docs/ensnode.io/src/components/molecules/EnsDbReaderIntro.astro index 001a59d39..0428513a4 100644 --- a/docs/ensnode.io/src/components/molecules/EnsDbReaderIntro.astro +++ b/docs/ensnode.io/src/components/molecules/EnsDbReaderIntro.astro @@ -3,7 +3,9 @@ import { Aside } from "@astrojs/starlight/components"; --- diff --git a/docs/ensnode.io/src/components/molecules/EnsNodeSchemaIntro.astro b/docs/ensnode.io/src/components/molecules/EnsNodeSchemaIntro.astro index 83c5e3fe6..25868b484 100644 --- a/docs/ensnode.io/src/components/molecules/EnsNodeSchemaIntro.astro +++ b/docs/ensnode.io/src/components/molecules/EnsNodeSchemaIntro.astro @@ -9,6 +9,6 @@ const ensNodeSchemaName = "ensnode"; schema within an ENSDb instance, used to store metadata about ENSIndexer instances that have ever connected to the ENSDb instance. There can just be just one ENSNode Schema per ENSDb - instance, and its name is always {ensNodeSchemaName}. + > that have ever connected to the ENSDb instance. There can be only one ENSNode Schema per ENSDb instance, + and its name is always {ensNodeSchemaName}. diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/account-domains.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/account-domains.mdx index 06752ece3..4da9ee6ee 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/account-domains.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/account-domains.mdx @@ -26,27 +26,30 @@ Count the Domains owned by an address, grouped by Domain `type` (`ENSv1Domain` v + ```sql SELECT type, count(*) FROM ensindexer_0.domains WHERE owner_id = '0xd8da6bf26964af9d7eed9e03e53415d37aa96045' GROUP BY type; ``` + + + ```typescript -import { count, eq } from 'drizzle-orm'; +import { count, eq } from "drizzle-orm"; const counts = await ensDb -.select({ type: ensIndexerSchema.domain.type, count: count() }) -.from(ensIndexerSchema.domain) -.where(eq(ensIndexerSchema.domain.ownerId, "0xd8da6bf26964af9d7eed9e03e53415d37aa96045")) -.groupBy(ensIndexerSchema.domain.type); - + .select({ type: ensIndexerSchema.domain.type, count: count() }) + .from(ensIndexerSchema.domain) + .where(eq(ensIndexerSchema.domain.ownerId, "0xd8da6bf26964af9d7eed9e03e53415d37aa96045")) + .groupBy(ensIndexerSchema.domain.type); ``` + + - -``` diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-by-name.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-by-name.mdx index 7fbf0f5c0..7dc0d0ab1 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-by-name.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/domain-by-name.mdx @@ -79,28 +79,30 @@ Canonical fields (`canonical_name`, `canonical_path`, `canonical_node`, `canonic + ```sql SELECT * FROM ensindexer_0.domains WHERE canonical_name = 'vitalik.eth'; ``` + + + ```typescript -import { eq } from 'drizzle-orm'; +import { eq } from "drizzle-orm"; const [vitalik] = await ensDb -.select() -.from(ensIndexerSchema.domain) -.where(eq(ensIndexerSchema.domain.canonicalName, "vitalik.eth")); + .select() + .from(ensIndexerSchema.domain) + .where(eq(ensIndexerSchema.domain.canonicalName, "vitalik.eth")); console.log(vitalik); - ``` + - -``` diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/indexing-status.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/indexing-status.mdx index 43aee13bd..c3b0ee0fb 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/indexing-status.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/examples/indexing-status.mdx @@ -127,6 +127,7 @@ Read the indexing status snapshot for an ENSIndexer instance from the shared `en + ```sql -- Indexing status snapshot for the `ensindexer_0` ENSIndexer Schema SELECT value -> 'indexingStatus' as indexing_status_snapshot @@ -134,21 +135,24 @@ FROM "ensnode"."metadata" WHERE ens_indexer_schema_name = 'ensindexer_0' AND key = 'indexing_metadata_context'; ``` + + + ```typescript -import { IndexingMetadataContextStatusCodes } from '@ensnode/ensdb-sdk'; +import { IndexingMetadataContextStatusCodes } from "@ensnode/ensdb-sdk"; const indexingMetadataContext = await ensDbReader.getIndexingMetadataContext(); if (indexingMetadataContext.statusCode === IndexingMetadataContextStatusCodes.Initialized) { -const indexingStatusSnapshot = indexingMetadataContext.indexingStatus; -console.log(indexingStatusSnapshot, null, 2); + const indexingStatusSnapshot = indexingMetadataContext.indexingStatus; + console.log(JSON.stringify(indexingStatusSnapshot, null, 2)); } - ``` - - + + + + -``` From 3d9881c4d41be951d3649cb2cb3b5f72643259ff Mon Sep 17 00:00:00 2001 From: Tomasz Kopacki Date: Wed, 27 May 2026 11:47:34 +0200 Subject: [PATCH 03/13] Apply AI PR feedback --- .../docs/docs/integrate/integration-options/ensdb-cli.mdx | 2 +- .../docs/integrate/unigraph/examples/domain-by-name.mdx | 6 +++--- .../docs/integrate/unigraph/examples/indexing-status.mdx | 6 +++--- docs/ensnode.io/src/content/docs/docs/self-host/index.mdx | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-cli.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-cli.mdx index 764ac3222..68f688583 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-cli.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-cli.mdx @@ -4,7 +4,7 @@ description: Coming soon - publish, download, and diff snapshots of the live ENS --- import { LinkCard, Aside } from "@astrojs/starlight/components"; -import EnsDbSnapshotsTeaser from "../../../../../components/molecules/EnsDbSnapshotsTeaser.astro"; +import EnsDbSnapshotsTeaser from "@components/molecules/EnsDbSnapshotsTeaser.astro"; - ## What You Get ### Complete ENS State @@ -52,9 +52,11 @@ By building on a PostgreSQL database, ENSDb inherits world-class capabilities: ## What You Can Build -ENSDb unlocks a new universe of ENS applications: - - + ## Quick Start From 15fc5b24ff4f3c8936040e4a7f6f5d4c87103c27 Mon Sep 17 00:00:00 2001 From: Tomasz Kopacki Date: Wed, 27 May 2026 18:49:14 +0200 Subject: [PATCH 05/13] Udpate ENSNode Plugins page --- .../integration-options/ensdb-readers.mdx | 39 ++++++++++++++++--- .../integration-options/ensdb-writers.mdx | 8 ++-- .../integration-options/ensnode-plugins.mdx | 14 +++++++ .../docs/services/ensdb/concepts/glossary.mdx | 2 +- .../docs/docs/services/ensindexer/index.mdx | 2 +- 5 files changed, 53 insertions(+), 12 deletions(-) diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx index 9aa135545..8bf3b1bc5 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx @@ -5,17 +5,44 @@ description: How to build custom APIs on top of ENSDb, using the ENSDb Reader sp import { Aside, LinkCard } from "@astrojs/starlight/components"; -## Specification +## Standards compliant ENSDb Readers -## Reference Implementations +There are multiple [ENSDb Reader](/docs/services/ensdb/concepts/glossary#ensdb-reader) apps created (and planned) by the NameHash team. Find out more about each of them below. + +:::note[Build your own ENSDb Reader] +Continuing on the ideas shared in [ENSDb integration options page](/docs/integrate/integration-options/ensdb), you can build your own ENSDb Reader app and define custom data model and capabilities that are required for your use cases. Feel free to reach out to the NameHash team on [Telegram](https://t.me/ensnode) if you want to build your own ENSDb Reader and want any help or guidance! +::: + +### ENSApi + +ENSApi is a reference implementation of an [ENSDb Reader](/docs/services/ensdb/concepts/glossary#ensdb-reader), that includes standards compliant web services: +- A standards compliant [ENS Omnigraph GraphQL API](/docs/integrate/integration-options/omnigraph-graphql-api) on top of [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) such as `unigraph` and `protocol-acceleration`. +- A standards compliant [ENS Subgraph GraphQL API](/docs/integrate/integration-options/ens-subgraph-graphql-api) on top of [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) such as `subgraph`, `basenames`, `lineanames`, and `threedns`. +- An API for accessing the metadata stored in ENSDb, including [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) about the indexing status from the [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) and [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) about the overall [ENSNode stack of services](/docs/services) active in the ENSNode instance. -ENSApi is a reference implementation of an [ENSDb Reader](/docs/services/ensdb/concepts/glossary#ensdb-reader). This includes reference implementations for how someone can: -- Create a standards compliant [ENS Omnigraph GraphQL API](/docs/integrate/integration-options/omnigraph-graphql-api) on top of [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) such as `unigraph` and `protocol-acceleration`. -- Create a standards compliant [ENS Subgraph GraphQL API](/docs/integrate/integration-options/ens-subgraph-graphql-api) on top of [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) such as `subgraph`, `basenames`, `lineanames`, and `threedns`. -- Create APIs for accessing the metadata stored in ENSDb including [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) about the indexing status from the [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) and [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) about the overall [ENSNode stack of services](/docs/services) active in the ENSNode instance. + +### Other ENSDb Readers + + + + + + + diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx index 9a363d3fa..74ed5d3be 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx @@ -13,17 +13,17 @@ import { Aside, LinkCard } from "@astrojs/starlight/components"; - How to store that processed data in the [ENSDb instance](/docs/services/ensdb/concepts/glossary#ensdb-instance). - How to store metadata about the [EnsDbWriter](/docs/services/ensdb/concepts/glossary#ensdb-writer) in the [ENSDb instance](/docs/services/ensdb/concepts/glossary#ensdb-instance). - -## Building Your Own ENSDb Writer - +:::note[Build your own ENSDb Writer] You can build your own ENSDb Writer in any language, using any indexing framework, as long as you follow the [ENSDb Standard](/docs/services/ensdb/concepts/glossary#ensdb-standard). The ENSDb Standard defines rules and constraints for how an ENSDb Writer should write data into an ENSDb instance in a way that maintains the integrity of the data and supports interoperability with any ENSDb Reader. Your ENSDb Writer must include: - The _implementation_ of 1 or more standard compliant [ENSNode plugins](/docs/integrate/integration-options/ensnode-plugins). - The _implementation_ of an [EnsDbMetadataWriter](/docs/services/ensdb/concepts/glossary#ensdb-metadata-writer) that stores [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) about the [EnsDbWriter](/docs/services/ensdb/concepts/glossary#ensdb-writer) overall, including which [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) it has activated, what the status of indexing is across each indexed chain, etc. +::: +## Standards compliant ENSDb Writer -## Reference Implementations +[ENSIndexer](/docs/services/ensindexer) is a reference implementation of an [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) built by the NameHash team. It is a multi-chain ENS indexer built on top of [Ponder](https://ponder.sh/), a modular blockchain indexing framework. ENSIndexer processes events from each relevant chain and transforms the data, storing it in your ENSDb instance. + +## Community Plugins + +### Under development + +New plugins currently under development by the [EthId team](https://ethid.org/) for: +- [EFP (Ethereum Follow Protocol)](https://efp.app/) +- [Grails](https://grails.app/) + +:::tip[Unified data access] + +When new [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) are created, it can be possible for the [ENS Omnigraph API](/docs/integrate/integration-options/omnigraph-graphql-api) (or other APIs built by any ENSDb Reader) to unify the ability to query across ENSNode plugins in a single query. For example, to query both ENS State from the `unigraph` and EFP State about followers from the `efp` plugin in a single GraphQL query to the [ENS Omnigraph API](/docs/integrate/integration-options/omnigraph-graphql-api). + +::: diff --git a/docs/ensnode.io/src/content/docs/docs/services/ensdb/concepts/glossary.mdx b/docs/ensnode.io/src/content/docs/docs/services/ensdb/concepts/glossary.mdx index 3de7d12c2..b90945ea3 100644 --- a/docs/ensnode.io/src/content/docs/docs/services/ensdb/concepts/glossary.mdx +++ b/docs/ensnode.io/src/content/docs/docs/services/ensdb/concepts/glossary.mdx @@ -180,7 +180,7 @@ A running [ENSApi](#ensapi) process that serves GraphQL and REST APIs from an [E ### ENSIndexer -A reference implementation of an [ENSDb Writer](#ensdb-writer) that indexes onchain ENS data and writes to an [ENSDb instance](#ensdb-instance). It is built on top of [Ponder](https://ponder.sh/), a modular blockchain indexing framework. +A reference implementation of an [ENSDb Writer](#ensdb-writer) that indexes onchain ENS data and writes to an [ENSDb instance](#ensdb-instance). It is built on top of [Ponder](https://ponder.sh/), a modular blockchain indexing framework. ENSIndexer implements the [ENSDb Metadata Writer](#ensdb-metadata-writer) spec by writing metadata about itself into the [ENSNode Metadata Table](#ensnode-metadata-table) in the ENSDb instance. ### ENSIndexer Instance diff --git a/docs/ensnode.io/src/content/docs/docs/services/ensindexer/index.mdx b/docs/ensnode.io/src/content/docs/docs/services/ensindexer/index.mdx index 7e3bee2be..f89ae2242 100644 --- a/docs/ensnode.io/src/content/docs/docs/services/ensindexer/index.mdx +++ b/docs/ensnode.io/src/content/docs/docs/services/ensindexer/index.mdx @@ -8,7 +8,7 @@ sidebar: import { LinkCard } from "@astrojs/starlight/components"; -ENSIndexer is a [Ponder](https://ponder.sh) app that indexes ENS contracts across multiple chains. It processes events from each relevant chain and transforms the data, storing it in your Postgres database. +ENSIndexer is a reference implementation of an [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer). It uses [Ponder](https://ponder.sh) for indexing ENS state from contracts across multiple chains. It processes events from each relevant chain and transforms the data, storing it in your ENSDb instance. :::note While ENSIndexer can be run independently in certain scenarios, it is designed to work as part of the complete ENSNode system, and we recommend following the [ENSNode Contribution Guide](/docs/reference/contributing) if you'd like to run ENSIndexer locally, or the [ENSNode Deployment Guide](/docs/self-host) if you'd like to run ENSIndexer in the cloud. From 2e61b468358340054a64c9c187502be2c2f2c55c Mon Sep 17 00:00:00 2001 From: Tomasz Kopacki Date: Sat, 30 May 2026 15:57:21 +0200 Subject: [PATCH 06/13] Shift plugins narrative to focus on "ENSNode Plugins" --- .../starlight/sidebar-topics/services.ts | 2 +- .../docs/docs/integrate/ensv2-readiness.mdx | 2 +- .../integration-options/ensdb-readers.mdx | 5 +- .../integration-options/ensdb-writers.mdx | 26 +++++-- .../integration-options/ensnode-plugins.mdx | 73 ++++++++++++++----- .../integrate/integration-options/index.mdx | 35 ++++++++- .../docs/integrate/omnigraph/concepts.mdx | 2 +- .../integrate/unigraph/schema-reference.mdx | 4 +- .../docs/services/ensdb/concepts/glossary.mdx | 12 ++- .../contributing/creating-a-plugin.mdx | 34 +++++---- 10 files changed, 141 insertions(+), 54 deletions(-) diff --git a/docs/ensnode.io/config/integrations/starlight/sidebar-topics/services.ts b/docs/ensnode.io/config/integrations/starlight/sidebar-topics/services.ts index 36e0861be..5b17f38be 100644 --- a/docs/ensnode.io/config/integrations/starlight/sidebar-topics/services.ts +++ b/docs/ensnode.io/config/integrations/starlight/sidebar-topics/services.ts @@ -91,7 +91,7 @@ export const servicesSidebarTopic = { items: [ { label: "Overview", link: "/docs/services/ensindexer/contributing" }, { - label: "Creating a Plugin", + label: "ENSNode Plugins", link: "/docs/services/ensindexer/contributing/creating-a-plugin", }, ], diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/ensv2-readiness.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/ensv2-readiness.mdx index 82f38dd0d..a4e58f882 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/ensv2-readiness.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/ensv2-readiness.mdx @@ -22,7 +22,7 @@ Full access to ENS data formerly required two separate data-fetching strategies ## How ENSNode solves this -**The Unigraph Data Model** — [ENSIndexer](/docs/services/ensindexer)'s `unigraph` plugin builds a single, **unified** indexed data model in [ENSDb](/docs/services/ensdb) that combines all of ENSv1 — mainnet `.eth`, Basenames on Base, Lineanames on Linea, 3DNS on Optimism — together with ENSv2. One data model, every chain, both protocol versions. +**The Unigraph Data Model** — The `unigraph` [ENSNode plugin](/docs/integrate/integration-options/ensnode-plugins), implemented in [ENSIndexer](/docs/services/ensindexer), builds a single, **unified** indexed data model in [ENSDb](/docs/services/ensdb) that combines all of ENSv1 — mainnet `.eth`, Basenames on Base, Lineanames on Linea, 3DNS on Optimism — together with ENSv2. One data model, every chain, both protocol versions. **The Omnigraph API** — The [ENS Omnigraph API](/docs/integrate/omnigraph), delivered by [ENSApi](/docs/services/ensapi), is a fully typed GraphQL API on top of that Unigraph data model. It handles the ENS protocol's many implementation details for you, so you can focus on building your app instead of wiring up the protocol's internals. diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx index 8bf3b1bc5..1ccc2e70c 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx @@ -16,11 +16,11 @@ Continuing on the ideas shared in [ENSDb integration options page](/docs/integra ### ENSApi ENSApi is a reference implementation of an [ENSDb Reader](/docs/services/ensdb/concepts/glossary#ensdb-reader), that includes standards compliant web services: + - A standards compliant [ENS Omnigraph GraphQL API](/docs/integrate/integration-options/omnigraph-graphql-api) on top of [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) such as `unigraph` and `protocol-acceleration`. -- A standards compliant [ENS Subgraph GraphQL API](/docs/integrate/integration-options/ens-subgraph-graphql-api) on top of [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) such as `subgraph`, `basenames`, `lineanames`, and `threedns`. +- A standards compliant [ENS Subgraph GraphQL API](/docs/integrate/ens-subgraph) on top of [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) such as `subgraph`, `basenames`, `lineanames`, and `threedns`. - An API for accessing the metadata stored in ENSDb, including [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) about the indexing status from the [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) and [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) about the overall [ENSNode stack of services](/docs/services) active in the ENSNode instance. - - diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx index 74ed5d3be..6ede68db8 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx @@ -5,23 +5,25 @@ description: How to build indexers for ENSDb, using the ENSDb Writer specificati import { Aside, LinkCard } from "@astrojs/starlight/components"; -## Overview +[EnsDbWriter](/docs/services/ensdb/concepts/glossary#ensdb-writer) defines how an indexing process for ENS looks like, including: -[EnsDbWriter](/docs/services/ensdb/concepts/glossary#ensdb-writer) defines how an indexing process for ENS looks like, including: - How to source onchain data about ENS (events, blocks, etc.) - How to process onchain data into (including transforming raw onchain data into a desired internal data model). - How to store that processed data in the [ENSDb instance](/docs/services/ensdb/concepts/glossary#ensdb-instance). - How to store metadata about the [EnsDbWriter](/docs/services/ensdb/concepts/glossary#ensdb-writer) in the [ENSDb instance](/docs/services/ensdb/concepts/glossary#ensdb-instance). -:::note[Build your own ENSDb Writer] +:::tip[Build your own ENSDb Writer] You can build your own ENSDb Writer in any language, using any indexing framework, as long as you follow the [ENSDb Standard](/docs/services/ensdb/concepts/glossary#ensdb-standard). The ENSDb Standard defines rules and constraints for how an ENSDb Writer should write data into an ENSDb instance in a way that maintains the integrity of the data and supports interoperability with any ENSDb Reader. Your ENSDb Writer must include: + - The _implementation_ of 1 or more standard compliant [ENSNode plugins](/docs/integrate/integration-options/ensnode-plugins). - The _implementation_ of an [EnsDbMetadataWriter](/docs/services/ensdb/concepts/glossary#ensdb-metadata-writer) that stores [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) about the [EnsDbWriter](/docs/services/ensdb/concepts/glossary#ensdb-writer) overall, including which [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) it has activated, what the status of indexing is across each indexed chain, etc. -::: + ::: + +## Standards compliant ENSDb Writers -## Standards compliant ENSDb Writer +### ENSIndexer [ENSIndexer](/docs/services/ensindexer) is a reference implementation of an [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) built by the NameHash team. It is a multi-chain ENS indexer built on top of [Ponder](https://ponder.sh/), a modular blockchain indexing framework. ENSIndexer processes events from each relevant chain and transforms the data, storing it in your ENSDb instance. @@ -30,3 +32,17 @@ Your ENSDb Writer must include: description="A reference implementation of ENSDb Writer, built by the NameHash team." href="/docs/services/ensindexer" /> + +### Envio + +The [Envio](https://envio.dev/) team is actively collaborating with NameHash Labs to build another standards-compliant [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) that uses Envio as the indexing engine. Their initial plugin is `subgraph`, with plans to support `unigraph` and `protocol-acceleration` after that. + +## Other Potential ENSDb Writers + +### Amp (Edge & Node) + +[Amp](https://www.edgeandnode.com/articles/stream-live-chain-data-into-your-analytics-stack-with-amp) by [Edge & Node](https://www.edgeandnode.com) is a next-generation blockchain data platform that transforms onchain activity into structured, verifiable datasets — preserving full cryptographic provenance for compliance and auditability. Amp can stream live onchain data, including live ENS state, making it a perfect foundation for a new production-grade ENSDb Writer implementation. + +### Build Your Own + +You can build your own ENSDb Writer in any language, using any indexing framework, as long as you follow the [ENSDb Standard](/docs/services/ensdb/concepts/glossary#ensdb-standard). Join us on [Telegram](https://t.me/ensnode) for any questions and support. diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensnode-plugins.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensnode-plugins.mdx index b08fa8713..f15d5faf3 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensnode-plugins.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensnode-plugins.mdx @@ -5,30 +5,69 @@ description: How to customize data models for ENSNode, using the ENSNode Plugin import { Aside, LinkCard } from "@astrojs/starlight/components"; -## Specification +## What is an ENSNode Plugin? -## Reference Implementations +An **ENSNode Plugin** is an abstract specification that defines how a specific aspect of the ENS namespace is indexed into [ENSDb](/docs/services/ensdb). It is **not** an implementation — it is a standard that any [EnsDbWriter](/docs/services/ensdb/concepts/glossary#ensdb-writer) can implement. - +Each ENSNode Plugin defines: - +- **Name** — e.g. `unigraph`, `protocol-acceleration`, `subgraph`. +- **Datasources** — which onchain contracts should be indexed, as a function of the ENS namespace. +- **Dependency relationships** — other plugins that must (or must not) be activated concurrently. +- **Indexed data model** — the tables, columns, and indexes that the plugin produces in ENSDb. +- **Standards and invariants** — rules for how onchain events are translated into the indexed data model during indexing. +- **Versioning** — a version number that can be stored in ENSNode Metadata, to track which version of the plugin implementation is being used by ENSNode Writers and Readers. -## Community Plugins +## Why ENSNode Plugins Matter -### Under development +ENSNode Plugins are the key architectural piece that enables a decoupling between [EnsDbWriters](/docs/services/ensdb/concepts/glossary#ensdb-writer) and [EnsDbReaders](/docs/services/ensdb/concepts/glossary#ensdb-reader), so that anyone can create their own implementations of these. For example, any team working on indexing infrastructure can implement an ENSDb Writer and have it produce a standards compliant ENSDb. On the other hand, any team working on products for ENS ecosystem can build their own standards compliant ENSDb Reader and have it query ENSDb. -New plugins currently under development by the [EthId team](https://ethid.org/) for: -- [EFP (Ethereum Follow Protocol)](https://efp.app/) -- [Grails](https://grails.app/) +:::note[Interoperability between ENSDb Writers and Readers] +When new ENSNode plugins are created, it becomes possible for the [ENS Omnigraph API](/docs/integrate/omnigraph) (or other APIs built by any EnsDbReader) to unify the ability to query across ENSNode plugins in a single query. For example, you could query both ENS state from the `unigraph` and EFP state about followers from the `efp` plugin in a single GraphQL query. +::: -:::tip[Unified data access] +## Core Plugins -When new [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) are created, it can be possible for the [ENS Omnigraph API](/docs/integrate/integration-options/omnigraph-graphql-api) (or other APIs built by any ENSDb Reader) to unify the ability to query across ENSNode plugins in a single query. For example, to query both ENS State from the `unigraph` and EFP State about followers from the `efp` plugin in a single GraphQL query to the [ENS Omnigraph API](/docs/integrate/integration-options/omnigraph-graphql-api). +[ENSIndexer](/docs/services/ensindexer) is a reference implementation of an [EnsDbWriter](/docs/services/ensdb/concepts/glossary#ensdb-writer) that implements multiple core plugins following the ENSNode Plugins specification. The code for each plugin inside ENSIndexer is a reference implementation of that plugin's abstract specification. [The core plugins implemented in ENSIndexer today](https://github.com/namehash/ensnode/tree/main/apps/ensindexer/src/plugins) are: +:::note[Built by the NameHash team] +All core ENSNode Plugins are built by the NameHash team. [We welcome contributions and collaborations to expand the ecosystem of plugins](#build-your-own). ::: + +| Plugin | Description | +| ----------------------- | ---------------------------------------------------------- | +| `unigraph` | Unified ENSv1 + ENSv2 data model with polymorphic entities | +| `protocol-acceleration` | Accelerated lookups for ENS resolution | +| `subgraph` | Legacy ENS Subgraph-compatible data model | +| `basenames` | Basenames (`.base.eth`) subname indexing | +| `lineanames` | Lineanames (`.linea.eth`) subname indexing | +| `threedns` | 3DNS (`.box`) name indexing | +| `registrars` | Registration and renewal lifecycle tracking | +| `tokenscope` | NFT tokenization and marketplace activity | + +## Community Plugins + +### Under Development + +The `efp` plugin is [a new plugin currently under development](https://github.com/Quantumlyy/efpnode/tree/main/packages/ensnode-plugin-efp) by the [EthId team](https://ethid.org/): + +- [EFP (Ethereum Follow Protocol)](https://efp.app/) — onchain social graph protocol +- [Grails](https://grails.app/) — by the EthId Foundation + +### Build Your Own + +If you are interested in defining a new ENSNode plugin or implementing an existing one, reach out to the NameHash Labs team — we are happy to provide support and additional info. Join us on [Telegram](https://t.me/ensnode) for any questions. + +## Related + + + + diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/index.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/index.mdx index 3b3aaeb69..15424723a 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/index.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/index.mdx @@ -45,7 +45,34 @@ For special use cases that go beyond what the ENS Omnigraph exposes, query the l href="/docs/integrate/integration-options/ensdb" /> -## 5. enscli +## 5. ENSDb Writers + +Build your own indexer for ENSDb by implementing the [ENSNode Plugin](/docs/integrate/integration-options/ensnode-plugins) specification. ENSDb Writers index onchain ENS data and write it into an ENSDb instance. + + + +## 6. ENSDb Readers + +Build custom APIs on top of ENSDb. ENSDb Readers query indexed ENS data from an ENSDb instance and serve it through any API surface (GraphQL, REST, gRPC, etc.). + + + +## 7. ENSNode Plugins + +ENSNode Plugins are abstract specifications that define indexed data models for ENS. They are the key architectural piece that enables decoupling between ENSDb Writers and ENSDb Readers. + + + +## 8. enscli `enscli` is a CLI that wraps `enssdk` to bring the ENS Omnigraph to the terminal. Designed for developers exploring or validating integrations, operators wiring ENS lookups into shell pipelines, and AI coding agents driving `ensskills`. @@ -54,7 +81,7 @@ For special use cases that go beyond what the ENS Omnigraph exposes, query the l href="/docs/integrate/integration-options/enscli" /> -## 6. ensskills +## 9. ensskills `ensskills` is a collection of curated skill bundles that give AI coding agents a well-defined contract for working with ENS — powering conversational ENS lookups and streamlining integration code written with `enskit`, `enssdk`, or the raw Omnigraph API. @@ -63,7 +90,7 @@ For special use cases that go beyond what the ENS Omnigraph exposes, query the l href="/docs/integrate/integration-options/ensskills" /> -## 7. ensdb-cli & ENSDb snapshots +## 10. ensdb-cli & ENSDb snapshots `ensdb-cli` is the operator-facing tool for ENSDb snapshots — portable, versioned packages of an ENSDb instance. Pull one down, restore it into Postgres, and start querying ENS in minutes instead of waiting days to complete a full historical indexing backfill from scratch. @@ -72,7 +99,7 @@ For special use cases that go beyond what the ENS Omnigraph exposes, query the l href="/docs/integrate/integration-options/ensdb-cli" /> -## 8. ENSEngine +## 11. ENSEngine ENSEngine watches your ENSDb for changes in real time and delivers ENS-aware events — including webhooks — to any sink you configure. Stop polling and start reacting to ENS state changes. diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/omnigraph/concepts.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/omnigraph/concepts.mdx index 9aca48328..0527ef500 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/omnigraph/concepts.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/omnigraph/concepts.mdx @@ -82,7 +82,7 @@ query Namegraph { The **Unigraph** is the entire collection of these disjoint ENSv2 Namegraphs and multiple ENSv1 Nametables, combined together into a single unified data model using ENS Resolution semantics. Navigating the Unigraph from `"eth"` down to `"vitalik.eth"` and beyond looks identical regardless of whether the underlying entities are ENSv1 or ENSv2. -The [`unigraph` plugin](/docs/services/ensindexer) in ENSIndexer is what builds this unified model. The Unigraph constructs two Namegraphs, one rooted at the ENSv1 Root Registry and another rooted at the ENSv2 Root Registry. It's also where multichain coverage lives: Basenames (`.base.eth`), Lineanames (`.linea.eth`), and 3DNS names (`.box`) are all stitched into the ENSv1 Namegraph. +The `unigraph` [ENSNode plugin](/docs/integrate/integration-options/ensnode-plugins), implemented in [ENSIndexer](/docs/services/ensindexer), is what builds this unified model. The Unigraph constructs two Namegraphs, one rooted at the ENSv1 Root Registry and another rooted at the ENSv2 Root Registry. It's also where multichain coverage lives: Basenames (`.base.eth`), Lineanames (`.linea.eth`), and 3DNS names (`.box`) are all stitched into the ENSv1 Namegraph. ```mermaid flowchart TD diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/schema-reference.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/schema-reference.mdx index c709f900f..8c77e67c1 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/schema-reference.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/unigraph/schema-reference.mdx @@ -7,14 +7,14 @@ sidebar: import { Aside } from "@astrojs/starlight/components"; -This is the canonical reference for the **Unigraph schema** — the unified, polymorphic data model that the [`unigraph` plugin](/docs/services/ensindexer) materializes into [ENSDb](/docs/services/ensdb). It models ENSv1 and ENSv2 with shared, polymorphic entities (Domains, Registries, Registrations, Renewals, Resolvers), so the same query shape works across both protocol versions. +This is the canonical reference for the **Unigraph schema** — the unified, polymorphic data model that the `unigraph` [ENSNode plugin](/docs/integrate/integration-options/ensnode-plugins) (implemented in [ENSIndexer](/docs/services/ensindexer)) materializes into [ENSDb](/docs/services/ensdb). It models ENSv1 and ENSv2 with shared, polymorphic entities (Domains, Registries, Registrations, Renewals, Resolvers), so the same query shape works across both protocol versions. Each ENSIndexer instance owns a dedicated database schema (e.g. `ensindexer_0`) holding all of its indexed Unigraph data, fully isolated from other instances. diff --git a/docs/ensnode.io/src/content/docs/docs/services/ensdb/concepts/glossary.mdx b/docs/ensnode.io/src/content/docs/docs/services/ensdb/concepts/glossary.mdx index b90945ea3..e5549cd22 100644 --- a/docs/ensnode.io/src/content/docs/docs/services/ensdb/concepts/glossary.mdx +++ b/docs/ensnode.io/src/content/docs/docs/services/ensdb/concepts/glossary.mdx @@ -51,9 +51,13 @@ An open standard for bi-directional ENS integration. The ENSDb Standard defines: Any [PostgreSQL database](#postgresql-database) following the ENSDb Standard is an [ENSDb instance](#ensdb-instance). +### ENSNode Plugin + +An abstract specification that defines how a specific aspect of the ENS namespace is indexed into [ENSDb](/docs/services/ensdb). A plugin defines: a name, datasources (which onchain contracts to index as a function of the ENS namespace), dependency relationships with other plugins, an indexed data model with indexes, and standards and invariants for how onchain events are translated into that indexed data model during indexing. Any [ENSDb Writer](#ensdb-writer) can implement an ENSNode Plugin. + ### ENSDb Writer -Any application that writes ENS data into an [ENSDb instance](#ensdb-instance) following the [ENSDb Standard](#ensdb-standard). For example, [ENSIndexer](#ensindexer) is a reference implementation of an ENSDb Writer. Other implementations of ENSDb Writers can be built in any language, and can use different indexing frameworks (i.e. [Ponder](https://ponder.sh/), [rindexer](https://rindexer.xyz/)), as long as they follow the ENSDb Standard. +Any application that implements one or more standard-compliant [ENSNode Plugins](#ensnode-plugin) and includes an [ENSDb Metadata Writer](#ensdb-metadata-writer), writing ENS data into an [ENSDb instance](#ensdb-instance) following the [ENSDb Standard](#ensdb-standard). For example, [ENSIndexer](#ensindexer) is a reference implementation of an ENSDb Writer. Other implementations of ENSDb Writers can be built in any language, and can use different indexing frameworks (i.e. [Ponder](https://ponder.sh/), [Envio](https://envio.dev/), [rindexer](https://rindexer.xyz/)), as long as they follow the ENSDb Standard. ### ENSDb Metadata Writer @@ -63,7 +67,7 @@ Other implementations of ENSDb Metadata Writers can be built in any language, as ### ENSDb Reader -Any application that reads ENS data from an [ENSDb instance](#ensdb-instance) following the [ENSDb Standard](#ensdb-standard). For example, [ENSApi](#ensapi) is a reference implementation of an ENSDb Reader. +Any application that reads ENS data from an [ENSDb instance](#ensdb-instance) following the [ENSDb Standard](#ensdb-standard). It knows how to read state from ENSDb, including overall metadata from the sole [ENSDb Writer](#ensdb-writer) and (where relevant) data associated with the [ENSNode Plugins](#ensnode-plugin) relevant to the specific ENSDb Reader implementation. For example, [ENSApi](#ensapi) is a reference implementation of an ENSDb Reader. Other implementations of ENSDb Readers can be built in any language, and can serve different types of APIs (GraphQL, REST, gRPC, etc.), as long as they follow the ENSDb Standard. @@ -155,8 +159,8 @@ The `value` column stores a JSON object which structure may evolve over time. To The `key` column identifies the type of metadata: -| Key | Description | -| --------------------------- | ---------------------------------------------------------------------------------------------------------- | +| Key | Description | +| --------------------------- | ------------------------------------------------------------------------------------------------------ | | `indexing_metadata_context` | [Indexing metadata context](#indexing-metadata-context) for the [ENSDb Writer instance](#ensdb-writer) | #### Indexing Metadata Context diff --git a/docs/ensnode.io/src/content/docs/docs/services/ensindexer/contributing/creating-a-plugin.mdx b/docs/ensnode.io/src/content/docs/docs/services/ensindexer/contributing/creating-a-plugin.mdx index 77f5928ef..3be23e7c2 100644 --- a/docs/ensnode.io/src/content/docs/docs/services/ensindexer/contributing/creating-a-plugin.mdx +++ b/docs/ensnode.io/src/content/docs/docs/services/ensindexer/contributing/creating-a-plugin.mdx @@ -1,22 +1,32 @@ --- -title: Creating a Plugin -description: Learn how to create a plugin for ENSIndexer +title: ENSNode Plugins in ENSIndexer +description: How ENSIndexer implements ENSNode plugins sidebar: - label: Creating a Plugin + label: ENSNode Plugins order: 2 --- import { LinkCard } from "@astrojs/starlight/components"; -## ENSIndexer Plugins +ENSIndexer is a reference implementation of an [EnsDbWriter](/docs/services/ensdb/concepts/glossary#ensdb-writer) that implements [ENSNode plugins](/docs/integrate/integration-options/ensnode-plugins). The code for each plugin inside ENSIndexer is a reference implementation of that plugin's abstract specification. -ENSNode is extensible through ENSIndexer plugins that implement custom indexing logic and produce custom indexed data models inside ENSDb. This allows you to tailor ENSNode to your specific use case and data needs. +For the full specification of ENSNode plugins and how they enable decoupling between [EnsDbWriters](/docs/integrate/integration-options/ensdb-writers) and [EnsDbReaders](/docs/integrate/integration-options/ensdb-readers), see the [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) integration guide. -ENSIndexer will only activate the plugins you specify in the `PLUGINS` env variable, so you can choose to only activate the plugins that are relevant to your use case. The `PLUGINS` env variable accepts a comma-separated list of plugin names to be activated. For example, if you want to activate the `ensv2` and `protocol-acceleration` plugins, you can set `PLUGINS=ensv2,protocol-acceleration`. + -## Plugin Architecture +## How ENSIndexer implements ENSNode plugins -Each ENSIndexer plugin is a standalone TypeScript module that can be developed, tested, and deployed independently. The ENSIndexer Plugin can define its own indexed data models and indexing logic. It must include two main files: +ENSNode is extensible through ENSNode Plugins. You can have your ENSIndexer implement custom indexing logic and produce custom indexed data models inside ENSDb. This allows you to tailor ENSNode to your specific use case and data needs. + +ENSIndexer will only activate the ENSNode Plugins which you specify in the `PLUGINS` env variable, so you can choose to only activate the plugins that are relevant to your use case. The `PLUGINS` env variable accepts a comma-separated list of plugin names to be activated. For example, if you want to activate the `unigraph` and `protocol-acceleration` plugins, you can set `PLUGINS=unigraph,protocol-acceleration`. + +## Plugin implementation structure + +Each ENSNode Plugin implemented in ENSIndexer is a standalone TypeScript module that can be developed, tested, and deployed independently. The ENSIndexer Plugin can define its own indexed data models and indexing logic. It must include two main files: - `event-handlers.ts`: This file defines the event handlers for the plugin, which are functions that will be called when specific onchain events are indexed. The event handlers contain the logic for how to process the indexed data and store it in the relevant indexed data model inside the ENSIndexer Schema. - `plugin.ts`: This file defines the plugin itself, including its name, description, and any configuration options, like datasources to be used for specifying onchain contracts that will be indexed. @@ -32,11 +42,3 @@ You need to import the `event-handlers.ts` file from each plugin into [`register The `plugin.ts` file has a default export with the plugin definition object returned from `createPlugin` function. The plugin definition object includes the plugin name, datasources required for the plugin to operate, and the config for contracts to be indexed by ENSIndexer when the plugin is active. You need to import the plugin definition object into [`apps/ensindexer/src/plugins/index.ts`](https://github.com/namehash/ensnode/tree/main/apps/ensindexer/src/plugins/index.ts) file and have it included in the `ALL_PLUGINS` array. This way, you let the ENSIndexer runtime know that the plugin is available for activation, which in turn allows you to activate the plugin by including its name in the `PLUGINS` env variable. - -## Existing Plugins - -You can find the current list of existing ENSIndexer plugins in [the ENSIndexer repository](https://github.com/namehash/ensnode/tree/main/apps/ensindexer/src/plugins). - -## Creating Your Own Plugin - -If you’re interested in building a plugin, reach out to the NameHash Labs team who is happy to provide support and additional info. From dc68c9a0f4adc58b54560f6d6853ded6692a498a Mon Sep 17 00:00:00 2001 From: Tomasz Kopacki Date: Sat, 30 May 2026 16:14:20 +0200 Subject: [PATCH 07/13] Apply AI PR feedback --- .../docs/integrate/integration-options/ensdb-readers.mdx | 1 + .../docs/integrate/integration-options/ensdb-writers.mdx | 5 +++-- .../integrate/integration-options/ensnode-plugins.mdx | 2 +- .../docs/docs/services/ensdb/concepts/glossary.mdx | 8 ++------ .../src/content/docs/docs/services/ensdb/index.mdx | 2 -- 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx index 1ccc2e70c..d63613efc 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx @@ -44,4 +44,5 @@ ENSApi is a reference implementation of an [ENSDb Reader](/docs/services/ensdb/c diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx index 6ede68db8..cbf6abd44 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx @@ -8,7 +8,7 @@ import { Aside, LinkCard } from "@astrojs/starlight/components"; [EnsDbWriter](/docs/services/ensdb/concepts/glossary#ensdb-writer) defines how an indexing process for ENS looks like, including: - How to source onchain data about ENS (events, blocks, etc.) -- How to process onchain data into (including transforming raw onchain data into a desired internal data model). +- How to process onchain data into an indexed data model (including transforming raw onchain data into a desired internal data model). - How to store that processed data in the [ENSDb instance](/docs/services/ensdb/concepts/glossary#ensdb-instance). - How to store metadata about the [EnsDbWriter](/docs/services/ensdb/concepts/glossary#ensdb-writer) in the [ENSDb instance](/docs/services/ensdb/concepts/glossary#ensdb-instance). @@ -19,7 +19,8 @@ Your ENSDb Writer must include: - The _implementation_ of 1 or more standard compliant [ENSNode plugins](/docs/integrate/integration-options/ensnode-plugins). - The _implementation_ of an [EnsDbMetadataWriter](/docs/services/ensdb/concepts/glossary#ensdb-metadata-writer) that stores [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) about the [EnsDbWriter](/docs/services/ensdb/concepts/glossary#ensdb-writer) overall, including which [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) it has activated, what the status of indexing is across each indexed chain, etc. - ::: + +::: ## Standards compliant ENSDb Writers diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensnode-plugins.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensnode-plugins.mdx index f15d5faf3..1fc57c426 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensnode-plugins.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensnode-plugins.mdx @@ -16,7 +16,7 @@ Each ENSNode Plugin defines: - **Dependency relationships** — other plugins that must (or must not) be activated concurrently. - **Indexed data model** — the tables, columns, and indexes that the plugin produces in ENSDb. - **Standards and invariants** — rules for how onchain events are translated into the indexed data model during indexing. -- **Versioning** — a version number that can be stored in ENSNode Metadata, to track which version of the plugin implementation is being used by ENSNode Writers and Readers. +- **Versioning** — a version number that can be stored in ENSNode Metadata, to track which version of the plugin implementation is being used by ENSDb Writers and ENSDb Readers. ## Why ENSNode Plugins Matter diff --git a/docs/ensnode.io/src/content/docs/docs/services/ensdb/concepts/glossary.mdx b/docs/ensnode.io/src/content/docs/docs/services/ensdb/concepts/glossary.mdx index e5549cd22..e1384f5cd 100644 --- a/docs/ensnode.io/src/content/docs/docs/services/ensdb/concepts/glossary.mdx +++ b/docs/ensnode.io/src/content/docs/docs/services/ensdb/concepts/glossary.mdx @@ -61,15 +61,11 @@ Any application that implements one or more standard-compliant [ENSNode Plugins] ### ENSDb Metadata Writer -Any application that writes metadata about an [EnsDbWriter](#ensdb-writer) into an [ENSDb instance](#ensdb-instance) following the [ENSDb Standard](#ensdb-standard). For example, [ENSIndexer](#ensindexer) is a reference implementation of an ENSDb Metadata Writer, which writes [Indexing Metadata Context](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) records into the [ENSNode Metadata Table](docs/services/ensdb/concepts/glossary#ensnode-metadata-table) for each ENSIndexer instance that have ever connected to the ENSDb instance. - -Other implementations of ENSDb Metadata Writers can be built in any language, as long as they follow the ENSDb Standard. +Any application that writes metadata about an [EnsDbWriter](#ensdb-writer) into an [ENSDb instance](#ensdb-instance) following the [ENSDb Standard](#ensdb-standard). For example, [ENSIndexer](#ensindexer) is a reference implementation of an ENSDb Metadata Writer, which writes [Indexing Metadata Context](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) records into the [ENSNode Metadata Table](/docs/services/ensdb/concepts/glossary#ensnode-metadata-table) for each ENSIndexer instance that have ever connected to the ENSDb instance. Other implementations of ENSDb Metadata Writers can be built in any language, as long as they follow the ENSDb Standard. ### ENSDb Reader -Any application that reads ENS data from an [ENSDb instance](#ensdb-instance) following the [ENSDb Standard](#ensdb-standard). It knows how to read state from ENSDb, including overall metadata from the sole [ENSDb Writer](#ensdb-writer) and (where relevant) data associated with the [ENSNode Plugins](#ensnode-plugin) relevant to the specific ENSDb Reader implementation. For example, [ENSApi](#ensapi) is a reference implementation of an ENSDb Reader. - -Other implementations of ENSDb Readers can be built in any language, and can serve different types of APIs (GraphQL, REST, gRPC, etc.), as long as they follow the ENSDb Standard. +Any application that reads ENS data from an [ENSDb instance](#ensdb-instance) following the [ENSDb Standard](#ensdb-standard). It knows how to read state from ENSDb, including overall metadata from the sole [ENSDb Writer](#ensdb-writer) and (where relevant) data associated with the [ENSNode Plugins](#ensnode-plugin) relevant to the specific ENSDb Reader implementation. For example, [ENSApi](#ensapi) is a reference implementation of an ENSDb Reader. Other implementations of ENSDb Readers can be built in any language, and can serve different types of APIs (GraphQL, REST, gRPC, etc.), as long as they follow the ENSDb Standard. ## ENSDb Concepts diff --git a/docs/ensnode.io/src/content/docs/docs/services/ensdb/index.mdx b/docs/ensnode.io/src/content/docs/docs/services/ensdb/index.mdx index dd9c0e004..946da6d76 100644 --- a/docs/ensnode.io/src/content/docs/docs/services/ensdb/index.mdx +++ b/docs/ensnode.io/src/content/docs/docs/services/ensdb/index.mdx @@ -7,8 +7,6 @@ sidebar: --- import { LinkCard, Aside } from "@astrojs/starlight/components"; -import EnsDbUseCases from "@components/molecules/EnsDbUseCases.astro"; -import EnsDbSelfHostingNote from "@components/molecules/EnsDbSelfHostingNote.astro"; ## Vision From 799444a29bda4e012638e1585503e34cb5d8f96e Mon Sep 17 00:00:00 2001 From: Tomasz Kopacki Date: Sat, 30 May 2026 16:18:37 +0200 Subject: [PATCH 08/13] Apply AI PR feedback --- .../docs/integrate/integration-options/ensdb-writers.mdx | 6 +++--- .../docs/docs/integrate/integration-options/ensdb.mdx | 4 ++-- .../integrate/integration-options/ensnode-plugins.mdx | 8 ++++---- .../docs/docs/services/ensdb/concepts/glossary.mdx | 4 ++-- .../ensindexer/contributing/creating-a-plugin.mdx | 6 +++--- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx index cbf6abd44..a072cc862 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx @@ -5,12 +5,12 @@ description: How to build indexers for ENSDb, using the ENSDb Writer specificati import { Aside, LinkCard } from "@astrojs/starlight/components"; -[EnsDbWriter](/docs/services/ensdb/concepts/glossary#ensdb-writer) defines how an indexing process for ENS looks like, including: +[ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) defines how an indexing process for ENS looks like, including: - How to source onchain data about ENS (events, blocks, etc.) - How to process onchain data into an indexed data model (including transforming raw onchain data into a desired internal data model). - How to store that processed data in the [ENSDb instance](/docs/services/ensdb/concepts/glossary#ensdb-instance). -- How to store metadata about the [EnsDbWriter](/docs/services/ensdb/concepts/glossary#ensdb-writer) in the [ENSDb instance](/docs/services/ensdb/concepts/glossary#ensdb-instance). +- How to store metadata about the [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) in the [ENSDb instance](/docs/services/ensdb/concepts/glossary#ensdb-instance). :::tip[Build your own ENSDb Writer] You can build your own ENSDb Writer in any language, using any indexing framework, as long as you follow the [ENSDb Standard](/docs/services/ensdb/concepts/glossary#ensdb-standard). The ENSDb Standard defines rules and constraints for how an ENSDb Writer should write data into an ENSDb instance in a way that maintains the integrity of the data and supports interoperability with any ENSDb Reader. @@ -18,7 +18,7 @@ You can build your own ENSDb Writer in any language, using any indexing framewor Your ENSDb Writer must include: - The _implementation_ of 1 or more standard compliant [ENSNode plugins](/docs/integrate/integration-options/ensnode-plugins). -- The _implementation_ of an [EnsDbMetadataWriter](/docs/services/ensdb/concepts/glossary#ensdb-metadata-writer) that stores [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) about the [EnsDbWriter](/docs/services/ensdb/concepts/glossary#ensdb-writer) overall, including which [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) it has activated, what the status of indexing is across each indexed chain, etc. +- The _implementation_ of an [ENSDb Metadata Writer](/docs/services/ensdb/concepts/glossary#ensdb-metadata-writer) that stores [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) about the [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) overall, including which [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) it has activated, what the status of indexing is across each indexed chain, etc. ::: diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb.mdx index 5c22cff28..115304ad7 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb.mdx @@ -9,9 +9,9 @@ import EnsDbUseCases from "@components/molecules/EnsDbUseCases.astro"; For special use cases that go beyond what the ENS Omnigraph exposes — you can query the live onchain state of both **ENSv1 and ENSv2** directly via `SQL`. -**ENSDb** is a bi-directional integration standard for any EnsDbWriter and EnsDbReader implementations to coordinate around the live unified onchain state of ENSv1 **and ENSv2** in a carefully-crafted standardized data model within a PostgreSQL database. Because ENSDb builds on Postgres, you can use _any_ language with a Postgres driver — **TypeScript**, **Python**, **Rust**, **Go**, and more. +**ENSDb** is a bi-directional integration standard for any ENSDb Writer and ENSDb Reader implementations to coordinate around the live unified onchain state of ENSv1 **and ENSv2** in a carefully-crafted standardized data model within a PostgreSQL database. Because ENSDb builds on Postgres, you can use _any_ language with a Postgres driver — **TypeScript**, **Python**, **Rust**, **Go**, and more. -The [ENSDb standard](/docs/services/ensdb/concepts/glossary#ensdb-standard) also defines _the abstract specification_ for how [EnsDbWriters](/docs/integrate/integration-options/ensdb-writers) store their [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) in an [ENSDb instance](/docs/services/ensdb/concepts/glossary#ensdb-instance) in a manner that supports decoupling and interop with any of [EnsDbReaders](/docs/integrate/integration-options/ensdb-readers). +The [ENSDb standard](/docs/services/ensdb/concepts/glossary#ensdb-standard) also defines _the abstract specification_ for how [ENSDb Writers](/docs/integrate/integration-options/ensdb-writers) store their [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) in an [ENSDb instance](/docs/services/ensdb/concepts/glossary#ensdb-instance) in a manner that supports decoupling and interop with any of [ENSDb Readers](/docs/integrate/integration-options/ensdb-readers). :::tip[Coming soon: ensdb-cli & ENSDb snapshots] We're building [**`ensdb-cli` & ENSDb snapshots**](/docs/integrate/integration-options/ensdb-cli) so you can pull down a fresh ENSDb in minutes instead of paying for a full historical RPC backfill among many other benefits. diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensnode-plugins.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensnode-plugins.mdx index 1fc57c426..5832aa40c 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensnode-plugins.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensnode-plugins.mdx @@ -7,7 +7,7 @@ import { Aside, LinkCard } from "@astrojs/starlight/components"; ## What is an ENSNode Plugin? -An **ENSNode Plugin** is an abstract specification that defines how a specific aspect of the ENS namespace is indexed into [ENSDb](/docs/services/ensdb). It is **not** an implementation — it is a standard that any [EnsDbWriter](/docs/services/ensdb/concepts/glossary#ensdb-writer) can implement. +An **ENSNode Plugin** is an abstract specification that defines how a specific aspect of the ENS namespace is indexed into [ENSDb](/docs/services/ensdb). It is **not** an implementation — it is a standard that any [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) can implement. Each ENSNode Plugin defines: @@ -20,15 +20,15 @@ Each ENSNode Plugin defines: ## Why ENSNode Plugins Matter -ENSNode Plugins are the key architectural piece that enables a decoupling between [EnsDbWriters](/docs/services/ensdb/concepts/glossary#ensdb-writer) and [EnsDbReaders](/docs/services/ensdb/concepts/glossary#ensdb-reader), so that anyone can create their own implementations of these. For example, any team working on indexing infrastructure can implement an ENSDb Writer and have it produce a standards compliant ENSDb. On the other hand, any team working on products for ENS ecosystem can build their own standards compliant ENSDb Reader and have it query ENSDb. +ENSNode Plugins are the key architectural piece that enables a decoupling between [ENSDb Writers](/docs/services/ensdb/concepts/glossary#ensdb-writer) and [ENSDb Readers](/docs/services/ensdb/concepts/glossary#ensdb-reader), so that anyone can create their own implementations of these. For example, any team working on indexing infrastructure can implement an ENSDb Writer and have it produce a standards compliant ENSDb. On the other hand, any team working on products for ENS ecosystem can build their own standards compliant ENSDb Reader and have it query ENSDb. :::note[Interoperability between ENSDb Writers and Readers] -When new ENSNode plugins are created, it becomes possible for the [ENS Omnigraph API](/docs/integrate/omnigraph) (or other APIs built by any EnsDbReader) to unify the ability to query across ENSNode plugins in a single query. For example, you could query both ENS state from the `unigraph` and EFP state about followers from the `efp` plugin in a single GraphQL query. +When new ENSNode plugins are created, it becomes possible for the [ENS Omnigraph API](/docs/integrate/omnigraph) (or other APIs built by any ENSDb Reader) to unify the ability to query across ENSNode plugins in a single query. For example, you could query both ENS state from the `unigraph` and EFP state about followers from the `efp` plugin in a single GraphQL query. ::: ## Core Plugins -[ENSIndexer](/docs/services/ensindexer) is a reference implementation of an [EnsDbWriter](/docs/services/ensdb/concepts/glossary#ensdb-writer) that implements multiple core plugins following the ENSNode Plugins specification. The code for each plugin inside ENSIndexer is a reference implementation of that plugin's abstract specification. [The core plugins implemented in ENSIndexer today](https://github.com/namehash/ensnode/tree/main/apps/ensindexer/src/plugins) are: +[ENSIndexer](/docs/services/ensindexer) is a reference implementation of an [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) that implements multiple core plugins following the ENSNode Plugins specification. The code for each plugin inside ENSIndexer is a reference implementation of that plugin's abstract specification. [The core plugins implemented in ENSIndexer today](https://github.com/namehash/ensnode/tree/main/apps/ensindexer/src/plugins) are: :::note[Built by the NameHash team] All core ENSNode Plugins are built by the NameHash team. [We welcome contributions and collaborations to expand the ecosystem of plugins](#build-your-own). diff --git a/docs/ensnode.io/src/content/docs/docs/services/ensdb/concepts/glossary.mdx b/docs/ensnode.io/src/content/docs/docs/services/ensdb/concepts/glossary.mdx index e1384f5cd..ee1bdc41c 100644 --- a/docs/ensnode.io/src/content/docs/docs/services/ensdb/concepts/glossary.mdx +++ b/docs/ensnode.io/src/content/docs/docs/services/ensdb/concepts/glossary.mdx @@ -217,8 +217,8 @@ A TypeScript package published as [`@ensnode/ensdb-sdk`](https://www.npmjs.com/p The ENSDb SDK includes: -- [EnsDbReader Client](#ensdb-reader-client) — An ENSDb client implementation for querying ENSDb Metadata, and building custom queries against the [ENSDb instance](#ensdb-instance). -- [EnsDbWriter Client](#ensdb-writer-client) — An ENSDb client implementation for writing ENSNode Metadata and executing ENSNode migrations. +- [ENSDb Reader Client](#ensdb-reader-client) — An ENSDb client implementation for querying ENSDb Metadata, and building custom queries against the [ENSDb instance](#ensdb-instance). +- [ENSDb Writer Client](#ensdb-writer-client) — An ENSDb client implementation for writing ENSNode Metadata and executing ENSNode migrations. - [Schema Definitions](#schema-definition) — Drizzle schemas for [ENSIndexer Schema](#ensindexer-schema) and [ENSNode Schema](#ensnode-schema). ### ENSDb Reader Client diff --git a/docs/ensnode.io/src/content/docs/docs/services/ensindexer/contributing/creating-a-plugin.mdx b/docs/ensnode.io/src/content/docs/docs/services/ensindexer/contributing/creating-a-plugin.mdx index 3be23e7c2..37dbb66c1 100644 --- a/docs/ensnode.io/src/content/docs/docs/services/ensindexer/contributing/creating-a-plugin.mdx +++ b/docs/ensnode.io/src/content/docs/docs/services/ensindexer/contributing/creating-a-plugin.mdx @@ -8,9 +8,9 @@ sidebar: import { LinkCard } from "@astrojs/starlight/components"; -ENSIndexer is a reference implementation of an [EnsDbWriter](/docs/services/ensdb/concepts/glossary#ensdb-writer) that implements [ENSNode plugins](/docs/integrate/integration-options/ensnode-plugins). The code for each plugin inside ENSIndexer is a reference implementation of that plugin's abstract specification. +ENSIndexer is a reference implementation of an [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) that implements [ENSNode plugins](/docs/integrate/integration-options/ensnode-plugins). The code for each plugin inside ENSIndexer is a reference implementation of that plugin's abstract specification. -For the full specification of ENSNode plugins and how they enable decoupling between [EnsDbWriters](/docs/integrate/integration-options/ensdb-writers) and [EnsDbReaders](/docs/integrate/integration-options/ensdb-readers), see the [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) integration guide. +For the full specification of ENSNode plugins and how they enable decoupling between [ENSDb Writers](/docs/integrate/integration-options/ensdb-writers) and [ENSDb Readers](/docs/integrate/integration-options/ensdb-readers), see the [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) integration guide. Date: Sat, 30 May 2026 16:31:49 +0200 Subject: [PATCH 09/13] Apply AI PR feedback --- .../integrate/integration-options/ensdb-readers.mdx | 12 ++++++------ .../integrate/integration-options/ensdb-writers.mdx | 8 ++++---- .../integration-options/ensnode-plugins.mdx | 4 ++-- .../docs/docs/services/ensdb/concepts/glossary.mdx | 6 +++--- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx index d63613efc..ca855163d 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx @@ -3,22 +3,22 @@ title: ENSDb Readers (Custom APIs) description: How to build custom APIs on top of ENSDb, using the ENSDb Reader specification. --- -import { Aside, LinkCard } from "@astrojs/starlight/components"; +import { LinkCard } from "@astrojs/starlight/components"; -## Standards compliant ENSDb Readers +## Standards-compliant ENSDb Readers There are multiple [ENSDb Reader](/docs/services/ensdb/concepts/glossary#ensdb-reader) apps created (and planned) by the NameHash team. Find out more about each of them below. :::note[Build your own ENSDb Reader] -Continuing on the ideas shared in [ENSDb integration options page](/docs/integrate/integration-options/ensdb), you can build your own ENSDb Reader app and define custom data model and capabilities that are required for your use cases. Feel free to reach out to the NameHash team on [Telegram](https://t.me/ensnode) if you want to build your own ENSDb Reader and want any help or guidance! +Continuing on the ideas shared in [ENSDb integration options page](/docs/integrate/integration-options/ensdb), you can build your own ENSDb Reader app and define a custom data model and capabilities that are required for your use cases. Feel free to reach out to the NameHash team on [Telegram](https://t.me/ensnode) if you want to build your own ENSDb Reader and want any help or guidance! ::: ### ENSApi -ENSApi is a reference implementation of an [ENSDb Reader](/docs/services/ensdb/concepts/glossary#ensdb-reader), that includes standards compliant web services: +ENSApi is a reference implementation of an [ENSDb Reader](/docs/services/ensdb/concepts/glossary#ensdb-reader) that includes standards-compliant web services: -- A standards compliant [ENS Omnigraph GraphQL API](/docs/integrate/integration-options/omnigraph-graphql-api) on top of [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) such as `unigraph` and `protocol-acceleration`. -- A standards compliant [ENS Subgraph GraphQL API](/docs/integrate/ens-subgraph) on top of [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) such as `subgraph`, `basenames`, `lineanames`, and `threedns`. +- A standards-compliant [ENS Omnigraph GraphQL API](/docs/integrate/integration-options/omnigraph-graphql-api) on top of [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) such as `unigraph` and `protocol-acceleration`. +- A standards-compliant [ENS Subgraph GraphQL API](/docs/integrate/ens-subgraph) on top of [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) such as `subgraph`, `basenames`, `lineanames`, and `threedns`. - An API for accessing the metadata stored in ENSDb, including [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) about the indexing status from the [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) and [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) about the overall [ENSNode stack of services](/docs/services) active in the ENSNode instance. Date: Sat, 30 May 2026 16:33:40 +0200 Subject: [PATCH 10/13] Fix sidebar link desc --- .../config/integrations/starlight/sidebar-topics/services.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ensnode.io/config/integrations/starlight/sidebar-topics/services.ts b/docs/ensnode.io/config/integrations/starlight/sidebar-topics/services.ts index 5b17f38be..dfbc62a15 100644 --- a/docs/ensnode.io/config/integrations/starlight/sidebar-topics/services.ts +++ b/docs/ensnode.io/config/integrations/starlight/sidebar-topics/services.ts @@ -91,7 +91,7 @@ export const servicesSidebarTopic = { items: [ { label: "Overview", link: "/docs/services/ensindexer/contributing" }, { - label: "ENSNode Plugins", + label: "Creating an ENSNode Plugin", link: "/docs/services/ensindexer/contributing/creating-a-plugin", }, ], From 7078001e382bab780336cbf4f10d4344955843ff Mon Sep 17 00:00:00 2001 From: Tomek Kopacki Date: Mon, 1 Jun 2026 12:16:18 +0200 Subject: [PATCH 11/13] Apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: lightwalker.eth <126201998+lightwalker-eth@users.noreply.github.com> --- .../integration-options/ensdb-readers.mdx | 26 +++++++-------- .../integration-options/ensdb-writers.mdx | 28 +++++++--------- .../integrate/integration-options/ensdb.mdx | 4 +-- .../integration-options/ensnode-plugins.mdx | 33 ++++++++----------- .../integrate/integration-options/index.mdx | 10 +++--- .../docs/integrate/omnigraph/concepts.mdx | 2 +- .../docs/services/ensdb/concepts/glossary.mdx | 4 +-- 7 files changed, 46 insertions(+), 61 deletions(-) diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx index ca855163d..1bf0a0dd0 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx @@ -1,25 +1,19 @@ --- title: ENSDb Readers (Custom APIs) -description: How to build custom APIs on top of ENSDb, using the ENSDb Reader specification. +description: How to build custom APIs and under services on top of ENSDb, using the ENSDb Reader standard. --- import { LinkCard } from "@astrojs/starlight/components"; -## Standards-compliant ENSDb Readers - -There are multiple [ENSDb Reader](/docs/services/ensdb/concepts/glossary#ensdb-reader) apps created (and planned) by the NameHash team. Find out more about each of them below. - -:::note[Build your own ENSDb Reader] -Continuing on the ideas shared in [ENSDb integration options page](/docs/integrate/integration-options/ensdb), you can build your own ENSDb Reader app and define a custom data model and capabilities that are required for your use cases. Feel free to reach out to the NameHash team on [Telegram](https://t.me/ensnode) if you want to build your own ENSDb Reader and want any help or guidance! -::: +## Current ENSDb Readers ### ENSApi -ENSApi is a reference implementation of an [ENSDb Reader](/docs/services/ensdb/concepts/glossary#ensdb-reader) that includes standards-compliant web services: +ENSApi is a reference implementation of an [ENSDb Reader](/docs/services/ensdb/concepts/glossary#ensdb-reader) that includes the following APIs: -- A standards-compliant [ENS Omnigraph GraphQL API](/docs/integrate/integration-options/omnigraph-graphql-api) on top of [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) such as `unigraph` and `protocol-acceleration`. -- A standards-compliant [ENS Subgraph GraphQL API](/docs/integrate/ens-subgraph) on top of [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) such as `subgraph`, `basenames`, `lineanames`, and `threedns`. -- An API for accessing the metadata stored in ENSDb, including [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) about the indexing status from the [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) and [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) about the overall [ENSNode stack of services](/docs/services) active in the ENSNode instance. +- The new [ENS Omnigraph GraphQL API](/docs/integrate/integration-options/omnigraph-graphql-api) that's built on top of [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) such as `unigraph` and `protocol-acceleration`. +- A backwards-compatible [ENS Subgraph GraphQL API](/docs/integrate/ens-subgraph) that's built on top of [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) such as `subgraph`, `basenames`, `lineanames`, and `threedns`. +- APIs for various queries related to the the metadata stored in ENSDb, such as the indexing status from the [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) and [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) about the overall [ENSNode stack of services](/docs/services) active in the ENSNode instance. -### Other ENSDb Readers +### New ENSDb Readers Under Development - diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx index 700142a0d..89061ec1d 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx @@ -1,16 +1,11 @@ --- title: ENSDb Writers (Indexers) -description: How to build indexers for ENSDb, using the ENSDb Writer specification. +description: How to build your own custom indexer implementation for ENSDb, using the ENSDb Writer specification. --- import { LinkCard } from "@astrojs/starlight/components"; -An [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) defines how an indexing process for ENS looks like, including: - -- How to source onchain data about ENS (events, blocks, etc.) -- How to process onchain data into an indexed data model (including transforming raw onchain data into a desired internal data model). -- How to store that processed data in the [ENSDb instance](/docs/services/ensdb/concepts/glossary#ensdb-instance). -- How to store metadata about the [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) in the [ENSDb instance](/docs/services/ensdb/concepts/glossary#ensdb-instance). +An [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) is the implementation of an indexing service that implements one or more standards-compliant [ENSNode plugins](/docs/integrate/integration-options/ensnode-plugins) and implements a standards-compliant [ENSDb Metadata Writer](/docs/services/ensdb/concepts/glossary#ensdb-metadata-writer) that stores [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) about the [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer). :::tip[Build your own ENSDb Writer] You can build your own ENSDb Writer in any language, using any indexing framework, as long as you follow the [ENSDb Standard](/docs/services/ensdb/concepts/glossary#ensdb-standard). The ENSDb Standard defines rules and constraints for how an ENSDb Writer should write data into an ENSDb instance in a way that maintains the integrity of the data and supports interoperability with any ENSDb Reader. @@ -22,11 +17,11 @@ Your ENSDb Writer must include: ::: -## Standards-compliant ENSDb Writers +## Current ENSDb Writers ### ENSIndexer -[ENSIndexer](/docs/services/ensindexer) is a reference implementation of an [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) built by the NameHash team. It is a multi-chain ENS indexer built on top of [Ponder](https://ponder.sh/), a modular blockchain indexing framework. ENSIndexer processes events from each relevant chain and transforms the data, storing it in your ENSDb instance. +[ENSIndexer](/docs/services/ensindexer) is a reference implementation of an [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) built by the NameHash team. It is a multi-chain ENS indexer built on top of [Ponder](https://ponder.sh/) that implements many ENSNode Plugins. -### Envio - -The [Envio](https://envio.dev/) team is actively collaborating with NameHash Labs to build another standards-compliant [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) that uses Envio as the indexing engine. Their initial plugin is `subgraph`, with plans to support `unigraph` and `protocol-acceleration` after that. - -## Other Potential ENSDb Writers +## New ENSDb Writers Under Development or Discussions -### Amp (Edge & Node) +### Envio + +The [Envio](https://envio.dev/) team is actively collaborating with NameHash Labs to build another standards-compliant [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) that uses Envio as the indexing engine. Their initial ENSNode plugin under development is `subgraph`, with plans to support `unigraph` after that. + + +### Amp (Edge & Node) -[Amp](https://www.edgeandnode.com/articles/stream-live-chain-data-into-your-analytics-stack-with-amp) by [Edge & Node](https://www.edgeandnode.com) is a next-generation blockchain data platform that transforms onchain activity into structured, verifiable datasets — preserving full cryptographic provenance for compliance and auditability. Amp can stream live onchain data, including live ENS state, making it a perfect foundation for a new production-grade ENSDb Writer implementation. +[Edge & Node](https://www.edgeandnode.com) has discussions scheduled with the NameHash Labs team to investigate the use of their new [Amp](https://www.edgeandnode.com/articles/stream-live-chain-data-into-your-analytics-stack-with-amp) platform to implement an ENSDb Writer. ### Build Your Own diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb.mdx index 115304ad7..a3a86f360 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb.mdx @@ -9,9 +9,9 @@ import EnsDbUseCases from "@components/molecules/EnsDbUseCases.astro"; For special use cases that go beyond what the ENS Omnigraph exposes — you can query the live onchain state of both **ENSv1 and ENSv2** directly via `SQL`. -**ENSDb** is a bi-directional integration standard for any ENSDb Writer and ENSDb Reader implementations to coordinate around the live unified onchain state of ENSv1 **and ENSv2** in a carefully-crafted standardized data model within a PostgreSQL database. Because ENSDb builds on Postgres, you can use _any_ language with a Postgres driver — **TypeScript**, **Python**, **Rust**, **Go**, and more. +The bi-directional [ENSDb integration standard](/docs/services/ensdb/concepts/glossary#ensdb-standard) enables any decoupled [ENSDb Writer](/docs/integrate/integration-options/ensdb-writers) and [ENSDb Reader](/docs/integrate/integration-options/ensdb-readers) implementations to coordinate around the live unified onchain state of **ENSv1 and ENSv2** in a carefully-crafted standardized data model within a PostgreSQL database. Because ENSDb builds on Postgres, you can use _any_ language with a Postgres driver — **TypeScript**, **Python**, **Rust**, **Go**, and more. -The [ENSDb standard](/docs/services/ensdb/concepts/glossary#ensdb-standard) also defines _the abstract specification_ for how [ENSDb Writers](/docs/integrate/integration-options/ensdb-writers) store their [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) in an [ENSDb instance](/docs/services/ensdb/concepts/glossary#ensdb-instance) in a manner that supports decoupling and interop with any of [ENSDb Readers](/docs/integrate/integration-options/ensdb-readers). +The ENSDb standard also defines _the abstract specification_ for how ENSDb Writers store their [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) in an [ENSDb instance](/docs/services/ensdb/concepts/glossary#ensdb-instance). :::tip[Coming soon: ensdb-cli & ENSDb snapshots] We're building [**`ensdb-cli` & ENSDb snapshots**](/docs/integrate/integration-options/ensdb-cli) so you can pull down a fresh ENSDb in minutes instead of paying for a full historical RPC backfill among many other benefits. diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensnode-plugins.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensnode-plugins.mdx index a56e93dd8..69d324147 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensnode-plugins.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensnode-plugins.mdx @@ -7,32 +7,28 @@ import { LinkCard } from "@astrojs/starlight/components"; ## What is an ENSNode Plugin? -An **ENSNode Plugin** is an abstract specification that defines how a specific aspect of the ENS namespace is indexed into [ENSDb](/docs/services/ensdb). It is **not** an implementation — it is a standard that any [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) can implement. +An **ENSNode Plugin** is an abstract specification that defines how onchain data relevant to ENS should be indexed into [ENSDb](/docs/services/ensdb). It is **not** an implementation — it is a standard that any [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) can implement and that any [ENSDb Reader](/docs/services/ensdb/concepts/glossary#ensdb-reader) can read. Each ENSNode Plugin defines: - **Name** — e.g. `unigraph`, `protocol-acceleration`, `subgraph`. -- **Datasources** — which onchain contracts should be indexed, as a function of the ENS namespace. +- **Datasources** — which onchain contracts should be indexed, as a function of an ENS namespace. - **Dependency relationships** — other plugins that must (or must not) be activated concurrently. -- **Indexed data model** — the tables, columns, and indexes that the plugin produces in ENSDb. -- **Standards and invariants** — rules for how onchain events are translated into the indexed data model during indexing. -- **Versioning** — a version number that can be stored in ENSNode Metadata, to track which version of the plugin implementation is being used by ENSDb Writers and ENSDb Readers. +- **Indexed data model** — the tables, columns, and indexes that implementations of the plugin must produce in ENSDb. +- **Standards and invariants** — rules for how onchain events from the datasources are translated into the indexed data model during indexing. +- **Versioning** — a version number that can be stored in the ENSNode Metadata, to track which version of the plugin standard is being created by an ENSDb Writer and is available to ENSDb Readers. ## Why ENSNode Plugins Matter -ENSNode Plugins are the key architectural piece that enables a decoupling between [ENSDb Writers](/docs/services/ensdb/concepts/glossary#ensdb-writer) and [ENSDb Readers](/docs/services/ensdb/concepts/glossary#ensdb-reader), so that anyone can create their own implementations of these. For example, any team working on indexing infrastructure can implement an ENSDb Writer and have it produce a standards-compliant ENSDb. On the other hand, any team working on products for ENS ecosystem can build their own standards-compliant ENSDb Reader and have it query ENSDb. +ENSNode Plugins are a key architectural piece that enables a decoupling between [ENSDb Writers](/docs/services/ensdb/concepts/glossary#ensdb-writer) and [ENSDb Readers](/docs/services/ensdb/concepts/glossary#ensdb-reader), so that anyone can create their own implementations of these. For example, any team working on indexing infrastructure can implement an ENSDb Writer and have it produce a standards-compliant ENSDb. On the other hand, any team working on products or infrastructure in the ENS ecosystem can build their own standards-compliant ENSDb Reader and have it query ENSDb. :::note[Interoperability between ENSDb Writers and Readers] -When new ENSNode plugins are created, it becomes possible for the [ENS Omnigraph API](/docs/integrate/omnigraph) (or other APIs built by any ENSDb Reader) to unify the ability to query across ENSNode plugins in a single query. For example, you could query both ENS state from the `unigraph` and EFP state about followers from the `efp` plugin in a single GraphQL query. +When new ENSNode plugins are created, it becomes possible for the [ENS Omnigraph API](/docs/integrate/omnigraph) (or other APIs built by any ENSDb Reader) to unify the ability to query across ENSNode plugins in a single query. For example, you could query both ENS state from the `unigraph` and EFP state about followers from the `efp` plugin in a single Omnigraph GraphQL query. ::: -## Core Plugins +## Existing Plugins -[ENSIndexer](/docs/services/ensindexer) is a reference implementation of an [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) that implements multiple core plugins following the ENSNode Plugins specification. The code for each plugin inside ENSIndexer is a reference implementation of that plugin's abstract specification. [The core plugins implemented in ENSIndexer today](https://github.com/namehash/ensnode/tree/main/apps/ensindexer/src/plugins) are: - -:::note[Built by the NameHash team] -All core ENSNode Plugins are built by the NameHash team. [We welcome contributions and collaborations to expand the ecosystem of plugins](#build-your-own). -::: +[ENSIndexer](/docs/services/ensindexer) is a reference implementation of an [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) that implements multiple existing ENSNode Plugin specifications. The code for each plugin inside ENSIndexer is a reference implementation of that plugin's abstract specification. [The ENSNode Plugins implemented in ENSIndexer today](https://github.com/namehash/ensnode/tree/main/apps/ensindexer/src/plugins) are: | Plugin | Description | | ----------------------- | ---------------------------------------------------------- | @@ -43,16 +39,13 @@ All core ENSNode Plugins are built by the NameHash team. [We welcome contributio | `lineanames` | Lineanames (`.linea.eth`) subname indexing | | `threedns` | 3DNS (`.box`) name indexing | | `registrars` | Registration and renewal lifecycle tracking | -| `tokenscope` | NFT tokenization and marketplace activity | +| `tokenscope` | NFT tokenization of ENS names | -## Community Plugins +## New Plugins ### Under Development -The `efp` plugin is [a new plugin currently under development](https://github.com/Quantumlyy/efpnode/tree/main/packages/ensnode-plugin-efp) by the [EthId team](https://ethid.org/): - -- [EFP (Ethereum Follow Protocol)](https://efp.app/) — onchain social graph protocol -- [Grails](https://grails.app/) — by the EthId Foundation +An `efp` plugin for the [Ethereum Follow Protocol](https://efp.app/) is [already under active development](https://github.com/Quantumlyy/efpnode/tree/main/packages/ensnode-plugin-efp) by the [EthId team](https://ethid.org/). ### Build Your Own @@ -68,6 +61,6 @@ If you are interested in defining a new ENSNode plugin or implementing an existi diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/index.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/index.mdx index 15424723a..1388ccbb7 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/index.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/index.mdx @@ -47,25 +47,25 @@ For special use cases that go beyond what the ENS Omnigraph exposes, query the l ## 5. ENSDb Writers -Build your own indexer for ENSDb by implementing the [ENSNode Plugin](/docs/integrate/integration-options/ensnode-plugins) specification. ENSDb Writers index onchain ENS data and write it into an ENSDb instance. +Build your own indexer for ENSDb by implementing the [ENSNode Plugin](/docs/integrate/integration-options/ensnode-plugins) specifications you're interested to index. ENSDb Writers index onchain data and write it into an ENSDb instance according to the standards set by relevant ENSNode Plugins. ## 6. ENSDb Readers -Build custom APIs on top of ENSDb. ENSDb Readers query indexed ENS data from an ENSDb instance and serve it through any API surface (GraphQL, REST, gRPC, etc.). +Build custom APIs or other specialized services on top of ENSDb. ENSDb Readers read indexed ENS data from an ENSDb instance and serve it through any API surface (GraphQL, REST, gRPC, webhooks, etc.) or pipe it into specialized data processing pipelines through the PostgreSQL write-ahead-log. ## 7. ENSNode Plugins -ENSNode Plugins are abstract specifications that define indexed data models for ENS. They are the key architectural piece that enables decoupling between ENSDb Writers and ENSDb Readers. +ENSNode Plugins are abstract specifications that define indexed data models relevant to ENS. They are a key architectural piece that enables complete decoupling between ENSDb Writers and ENSDb Readers. Date: Mon, 1 Jun 2026 12:18:07 +0200 Subject: [PATCH 12/13] Apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: lightwalker.eth <126201998+lightwalker-eth@users.noreply.github.com> --- .../integration-options/ensdb-readers.mdx | 70 ++++++++++--------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx index 1bf0a0dd0..9837cf71d 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx @@ -1,44 +1,48 @@ ---- -title: ENSDb Readers (Custom APIs) +--- +title: ENSDb Readers (Custom APIs) description: How to build custom APIs and under services on top of ENSDb, using the ENSDb Reader standard. ---- - -import { LinkCard } from "@astrojs/starlight/components"; - +--- + +import { LinkCard } from "@astrojs/starlight/components"; + ## Current ENSDb Readers - -### ENSApi - + +### ENSApi + ENSApi is a reference implementation of an [ENSDb Reader](/docs/services/ensdb/concepts/glossary#ensdb-reader) that includes the following APIs: - + - The new [ENS Omnigraph GraphQL API](/docs/integrate/integration-options/omnigraph-graphql-api) that's built on top of [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) such as `unigraph` and `protocol-acceleration`. - A backwards-compatible [ENS Subgraph GraphQL API](/docs/integrate/ens-subgraph) that's built on top of [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) such as `subgraph`, `basenames`, `lineanames`, and `threedns`. - APIs for various queries related to the the metadata stored in ENSDb, such as the indexing status from the [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) and [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) about the overall [ENSNode stack of services](/docs/services) active in the ENSNode instance. - - - + + + ### New ENSDb Readers Under Development - + Multiple new [ENSDb Reader](/docs/services/ensdb/concepts/glossary#ensdb-reader) services are planned by the NameHash team. Find out more about each of them below. - - + + - - + href="/docs/integrate/integration-options/ensengine" +/> + + + +:::note[Build your own ENSDb Reader] +Creating your own ENSDb Reader service enables you to build your own completely custom APIs and data pipeline services. See related inspiration on the [ENSDb integration options page](/docs/integrate/integration-options/ensdb). Use any programming language or framework you wish! If you'd like any help or guidance feel welcome to reach out to the NameHash team on [Telegram](https://t.me/ensnode). +::: From a8ab221bb3b868e0702901ac8fae23c8a49f4aea Mon Sep 17 00:00:00 2001 From: Tomasz Kopacki Date: Mon, 1 Jun 2026 12:26:44 +0200 Subject: [PATCH 13/13] convert crlf to lf --- .../integration-options/ensdb-readers.mdx | 92 +++++++++---------- .../integration-options/ensdb-writers.mdx | 24 ++--- .../integrate/integration-options/ensdb.mdx | 4 +- .../integration-options/ensnode-plugins.mdx | 26 +++--- .../integrate/integration-options/index.mdx | 10 +- .../docs/integrate/omnigraph/concepts.mdx | 2 +- .../docs/services/ensdb/concepts/glossary.mdx | 2 +- 7 files changed, 80 insertions(+), 80 deletions(-) diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx index 9837cf71d..df51611ce 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-readers.mdx @@ -1,48 +1,48 @@ ---- -title: ENSDb Readers (Custom APIs) -description: How to build custom APIs and under services on top of ENSDb, using the ENSDb Reader standard. ---- - -import { LinkCard } from "@astrojs/starlight/components"; - -## Current ENSDb Readers - -### ENSApi - -ENSApi is a reference implementation of an [ENSDb Reader](/docs/services/ensdb/concepts/glossary#ensdb-reader) that includes the following APIs: - -- The new [ENS Omnigraph GraphQL API](/docs/integrate/integration-options/omnigraph-graphql-api) that's built on top of [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) such as `unigraph` and `protocol-acceleration`. -- A backwards-compatible [ENS Subgraph GraphQL API](/docs/integrate/ens-subgraph) that's built on top of [ENSNode Plugins](/docs/integrate/integration-options/ensnode-plugins) such as `subgraph`, `basenames`, `lineanames`, and `threedns`. -- APIs for various queries related to the the metadata stored in ENSDb, such as the indexing status from the [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) and [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) about the overall [ENSNode stack of services](/docs/services) active in the ENSNode instance. - - - -### New ENSDb Readers Under Development - -Multiple new [ENSDb Reader](/docs/services/ensdb/concepts/glossary#ensdb-reader) services are planned by the NameHash team. Find out more about each of them below. - - - - + +### New ENSDb Readers Under Development + +Multiple new [ENSDb Reader](/docs/services/ensdb/concepts/glossary#ensdb-reader) services are planned by the NameHash team. Find out more about each of them below. + + + + + + - - -:::note[Build your own ENSDb Reader] -Creating your own ENSDb Reader service enables you to build your own completely custom APIs and data pipeline services. See related inspiration on the [ENSDb integration options page](/docs/integrate/integration-options/ensdb). Use any programming language or framework you wish! If you'd like any help or guidance feel welcome to reach out to the NameHash team on [Telegram](https://t.me/ensnode). -::: +:::note[Build your own ENSDb Reader] +Creating your own ENSDb Reader service enables you to build your own completely custom APIs and data pipeline services. See related inspiration on the [ENSDb integration options page](/docs/integrate/integration-options/ensdb). Use any programming language or framework you wish! If you'd like any help or guidance feel welcome to reach out to the NameHash team on [Telegram](https://t.me/ensnode). +::: diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx index 89061ec1d..d9d57eaca 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb-writers.mdx @@ -1,11 +1,11 @@ --- title: ENSDb Writers (Indexers) -description: How to build your own custom indexer implementation for ENSDb, using the ENSDb Writer specification. +description: How to build your own custom indexer implementation for ENSDb, using the ENSDb Writer specification. --- import { LinkCard } from "@astrojs/starlight/components"; -An [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) is the implementation of an indexing service that implements one or more standards-compliant [ENSNode plugins](/docs/integrate/integration-options/ensnode-plugins) and implements a standards-compliant [ENSDb Metadata Writer](/docs/services/ensdb/concepts/glossary#ensdb-metadata-writer) that stores [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) about the [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer). +An [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) is the implementation of an indexing service that implements one or more standards-compliant [ENSNode plugins](/docs/integrate/integration-options/ensnode-plugins) and implements a standards-compliant [ENSDb Metadata Writer](/docs/services/ensdb/concepts/glossary#ensdb-metadata-writer) that stores [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) about the [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer). :::tip[Build your own ENSDb Writer] You can build your own ENSDb Writer in any language, using any indexing framework, as long as you follow the [ENSDb Standard](/docs/services/ensdb/concepts/glossary#ensdb-standard). The ENSDb Standard defines rules and constraints for how an ENSDb Writer should write data into an ENSDb instance in a way that maintains the integrity of the data and supports interoperability with any ENSDb Reader. @@ -17,11 +17,11 @@ Your ENSDb Writer must include: ::: -## Current ENSDb Writers +## Current ENSDb Writers ### ENSIndexer -[ENSIndexer](/docs/services/ensindexer) is a reference implementation of an [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) built by the NameHash team. It is a multi-chain ENS indexer built on top of [Ponder](https://ponder.sh/) that implements many ENSNode Plugins. +[ENSIndexer](/docs/services/ensindexer) is a reference implementation of an [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) built by the NameHash team. It is a multi-chain ENS indexer built on top of [Ponder](https://ponder.sh/) that implements many ENSNode Plugins. -## New ENSDb Writers Under Development or Discussions +## New ENSDb Writers Under Development or Discussions -### Envio - -The [Envio](https://envio.dev/) team is actively collaborating with NameHash Labs to build another standards-compliant [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) that uses Envio as the indexing engine. Their initial ENSNode plugin under development is `subgraph`, with plans to support `unigraph` after that. - - -### Amp (Edge & Node) +### Envio -[Edge & Node](https://www.edgeandnode.com) has discussions scheduled with the NameHash Labs team to investigate the use of their new [Amp](https://www.edgeandnode.com/articles/stream-live-chain-data-into-your-analytics-stack-with-amp) platform to implement an ENSDb Writer. +The [Envio](https://envio.dev/) team is actively collaborating with NameHash Labs to build another standards-compliant [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) that uses Envio as the indexing engine. Their initial ENSNode plugin under development is `subgraph`, with plans to support `unigraph` after that. + + +### Amp (Edge & Node) + +[Edge & Node](https://www.edgeandnode.com) has discussions scheduled with the NameHash Labs team to investigate the use of their new [Amp](https://www.edgeandnode.com/articles/stream-live-chain-data-into-your-analytics-stack-with-amp) platform to implement an ENSDb Writer. ### Build Your Own diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb.mdx index a3a86f360..11029b9b0 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensdb.mdx @@ -9,9 +9,9 @@ import EnsDbUseCases from "@components/molecules/EnsDbUseCases.astro"; For special use cases that go beyond what the ENS Omnigraph exposes — you can query the live onchain state of both **ENSv1 and ENSv2** directly via `SQL`. -The bi-directional [ENSDb integration standard](/docs/services/ensdb/concepts/glossary#ensdb-standard) enables any decoupled [ENSDb Writer](/docs/integrate/integration-options/ensdb-writers) and [ENSDb Reader](/docs/integrate/integration-options/ensdb-readers) implementations to coordinate around the live unified onchain state of **ENSv1 and ENSv2** in a carefully-crafted standardized data model within a PostgreSQL database. Because ENSDb builds on Postgres, you can use _any_ language with a Postgres driver — **TypeScript**, **Python**, **Rust**, **Go**, and more. +The bi-directional [ENSDb integration standard](/docs/services/ensdb/concepts/glossary#ensdb-standard) enables any decoupled [ENSDb Writer](/docs/integrate/integration-options/ensdb-writers) and [ENSDb Reader](/docs/integrate/integration-options/ensdb-readers) implementations to coordinate around the live unified onchain state of **ENSv1 and ENSv2** in a carefully-crafted standardized data model within a PostgreSQL database. Because ENSDb builds on Postgres, you can use _any_ language with a Postgres driver — **TypeScript**, **Python**, **Rust**, **Go**, and more. -The ENSDb standard also defines _the abstract specification_ for how ENSDb Writers store their [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) in an [ENSDb instance](/docs/services/ensdb/concepts/glossary#ensdb-instance). +The ENSDb standard also defines _the abstract specification_ for how ENSDb Writers store their [metadata](/docs/services/ensdb/concepts/glossary#indexing-metadata-context) in an [ENSDb instance](/docs/services/ensdb/concepts/glossary#ensdb-instance). :::tip[Coming soon: ensdb-cli & ENSDb snapshots] We're building [**`ensdb-cli` & ENSDb snapshots**](/docs/integrate/integration-options/ensdb-cli) so you can pull down a fresh ENSDb in minutes instead of paying for a full historical RPC backfill among many other benefits. diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensnode-plugins.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensnode-plugins.mdx index 69d324147..8fdc14cf1 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensnode-plugins.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/ensnode-plugins.mdx @@ -7,28 +7,28 @@ import { LinkCard } from "@astrojs/starlight/components"; ## What is an ENSNode Plugin? -An **ENSNode Plugin** is an abstract specification that defines how onchain data relevant to ENS should be indexed into [ENSDb](/docs/services/ensdb). It is **not** an implementation — it is a standard that any [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) can implement and that any [ENSDb Reader](/docs/services/ensdb/concepts/glossary#ensdb-reader) can read. +An **ENSNode Plugin** is an abstract specification that defines how onchain data relevant to ENS should be indexed into [ENSDb](/docs/services/ensdb). It is **not** an implementation — it is a standard that any [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) can implement and that any [ENSDb Reader](/docs/services/ensdb/concepts/glossary#ensdb-reader) can read. Each ENSNode Plugin defines: - **Name** — e.g. `unigraph`, `protocol-acceleration`, `subgraph`. -- **Datasources** — which onchain contracts should be indexed, as a function of an ENS namespace. +- **Datasources** — which onchain contracts should be indexed, as a function of an ENS namespace. - **Dependency relationships** — other plugins that must (or must not) be activated concurrently. -- **Indexed data model** — the tables, columns, and indexes that implementations of the plugin must produce in ENSDb. -- **Standards and invariants** — rules for how onchain events from the datasources are translated into the indexed data model during indexing. -- **Versioning** — a version number that can be stored in the ENSNode Metadata, to track which version of the plugin standard is being created by an ENSDb Writer and is available to ENSDb Readers. +- **Indexed data model** — the tables, columns, and indexes that implementations of the plugin must produce in ENSDb. +- **Standards and invariants** — rules for how onchain events from the datasources are translated into the indexed data model during indexing. +- **Versioning** — a version number that can be stored in the ENSNode Metadata, to track which version of the plugin standard is being created by an ENSDb Writer and is available to ENSDb Readers. ## Why ENSNode Plugins Matter -ENSNode Plugins are a key architectural piece that enables a decoupling between [ENSDb Writers](/docs/services/ensdb/concepts/glossary#ensdb-writer) and [ENSDb Readers](/docs/services/ensdb/concepts/glossary#ensdb-reader), so that anyone can create their own implementations of these. For example, any team working on indexing infrastructure can implement an ENSDb Writer and have it produce a standards-compliant ENSDb. On the other hand, any team working on products or infrastructure in the ENS ecosystem can build their own standards-compliant ENSDb Reader and have it query ENSDb. +ENSNode Plugins are a key architectural piece that enables a decoupling between [ENSDb Writers](/docs/services/ensdb/concepts/glossary#ensdb-writer) and [ENSDb Readers](/docs/services/ensdb/concepts/glossary#ensdb-reader), so that anyone can create their own implementations of these. For example, any team working on indexing infrastructure can implement an ENSDb Writer and have it produce a standards-compliant ENSDb. On the other hand, any team working on products or infrastructure in the ENS ecosystem can build their own standards-compliant ENSDb Reader and have it query ENSDb. :::note[Interoperability between ENSDb Writers and Readers] -When new ENSNode plugins are created, it becomes possible for the [ENS Omnigraph API](/docs/integrate/omnigraph) (or other APIs built by any ENSDb Reader) to unify the ability to query across ENSNode plugins in a single query. For example, you could query both ENS state from the `unigraph` and EFP state about followers from the `efp` plugin in a single Omnigraph GraphQL query. +When new ENSNode plugins are created, it becomes possible for the [ENS Omnigraph API](/docs/integrate/omnigraph) (or other APIs built by any ENSDb Reader) to unify the ability to query across ENSNode plugins in a single query. For example, you could query both ENS state from the `unigraph` and EFP state about followers from the `efp` plugin in a single Omnigraph GraphQL query. ::: -## Existing Plugins +## Existing Plugins -[ENSIndexer](/docs/services/ensindexer) is a reference implementation of an [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) that implements multiple existing ENSNode Plugin specifications. The code for each plugin inside ENSIndexer is a reference implementation of that plugin's abstract specification. [The ENSNode Plugins implemented in ENSIndexer today](https://github.com/namehash/ensnode/tree/main/apps/ensindexer/src/plugins) are: +[ENSIndexer](/docs/services/ensindexer) is a reference implementation of an [ENSDb Writer](/docs/services/ensdb/concepts/glossary#ensdb-writer) that implements multiple existing ENSNode Plugin specifications. The code for each plugin inside ENSIndexer is a reference implementation of that plugin's abstract specification. [The ENSNode Plugins implemented in ENSIndexer today](https://github.com/namehash/ensnode/tree/main/apps/ensindexer/src/plugins) are: | Plugin | Description | | ----------------------- | ---------------------------------------------------------- | @@ -39,13 +39,13 @@ When new ENSNode plugins are created, it becomes possible for the [ENS Omnigraph | `lineanames` | Lineanames (`.linea.eth`) subname indexing | | `threedns` | 3DNS (`.box`) name indexing | | `registrars` | Registration and renewal lifecycle tracking | -| `tokenscope` | NFT tokenization of ENS names | +| `tokenscope` | NFT tokenization of ENS names | -## New Plugins +## New Plugins ### Under Development -An `efp` plugin for the [Ethereum Follow Protocol](https://efp.app/) is [already under active development](https://github.com/Quantumlyy/efpnode/tree/main/packages/ensnode-plugin-efp) by the [EthId team](https://ethid.org/). +An `efp` plugin for the [Ethereum Follow Protocol](https://efp.app/) is [already under active development](https://github.com/Quantumlyy/efpnode/tree/main/packages/ensnode-plugin-efp) by the [EthId team](https://ethid.org/). ### Build Your Own @@ -61,6 +61,6 @@ If you are interested in defining a new ENSNode plugin or implementing an existi diff --git a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/index.mdx b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/index.mdx index 1388ccbb7..9376faded 100644 --- a/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/index.mdx +++ b/docs/ensnode.io/src/content/docs/docs/integrate/integration-options/index.mdx @@ -47,25 +47,25 @@ For special use cases that go beyond what the ENS Omnigraph exposes, query the l ## 5. ENSDb Writers -Build your own indexer for ENSDb by implementing the [ENSNode Plugin](/docs/integrate/integration-options/ensnode-plugins) specifications you're interested to index. ENSDb Writers index onchain data and write it into an ENSDb instance according to the standards set by relevant ENSNode Plugins. +Build your own indexer for ENSDb by implementing the [ENSNode Plugin](/docs/integrate/integration-options/ensnode-plugins) specifications you're interested to index. ENSDb Writers index onchain data and write it into an ENSDb instance according to the standards set by relevant ENSNode Plugins. ## 6. ENSDb Readers -Build custom APIs or other specialized services on top of ENSDb. ENSDb Readers read indexed ENS data from an ENSDb instance and serve it through any API surface (GraphQL, REST, gRPC, webhooks, etc.) or pipe it into specialized data processing pipelines through the PostgreSQL write-ahead-log. +Build custom APIs or other specialized services on top of ENSDb. ENSDb Readers read indexed ENS data from an ENSDb instance and serve it through any API surface (GraphQL, REST, gRPC, webhooks, etc.) or pipe it into specialized data processing pipelines through the PostgreSQL write-ahead-log. ## 7. ENSNode Plugins -ENSNode Plugins are abstract specifications that define indexed data models relevant to ENS. They are a key architectural piece that enables complete decoupling between ENSDb Writers and ENSDb Readers. +ENSNode Plugins are abstract specifications that define indexed data models relevant to ENS. They are a key architectural piece that enables complete decoupling between ENSDb Writers and ENSDb Readers.