
{"id":149081,"date":"2026-04-10T13:04:25","date_gmt":"2026-04-10T13:04:25","guid":{"rendered":"https:\/\/mycryptomania.com\/?p=149081"},"modified":"2026-04-10T13:04:25","modified_gmt":"2026-04-10T13:04:25","slug":"after-subgraphs-rethinking-web3-data-infrastructure-with-envio","status":"publish","type":"post","link":"https:\/\/mycryptomania.com\/?p=149081","title":{"rendered":"After Subgraphs: Rethinking Web3 Data Infrastructure with Envio"},"content":{"rendered":"<h3>The day your GraphQL endpoint\u00a0404s<\/h3>\n<p>If you were building in the \u201cSubgraph Era,\u201d your backend often had one quiet dependency: a hosted GraphQL endpoint that turned messy, low\u2011level chain data into clean entities.<\/p>\n<p>Then on <strong>December 8, 2025<\/strong>, <strong>Alchemy Subgraphs was sunset<\/strong> and \u201call subgraph and query endpoints\u201d were discontinued.<\/p>\n<p>What a lot of teams learned (sometimes the hard way) is that <em>indexing is not a nice-to-have analytics add-on<\/em>. It\u2019s application infrastructure. <a href=\"https:\/\/docs.envio.dev\/\">Envio\u2019s<\/a> own framing matches this: the indexer typically sits between the blockchain and your app backend, transforming raw on-chain data into the structured state you actually\u00a0query<\/p>\n<p>This article is a practical \u201cwhiteboard walk-through\u201d of what broke, what people learned, and how to rebuild a common subgraph-backed feature (a token-flow feed for traders\/bots) using <a href=\"https:\/\/docs.envio.dev\/docs\/HyperIndex\/overview\"><strong>Envio HyperIndex<\/strong>\u200a<\/a>\u2014\u200awith enough technical depth that an engineer can ship it, and enough intuition that a trader understands why it\u00a0matters.<\/p>\n<h3>What subgraphs were and why the shutdown hit so many\u00a0teams<\/h3>\n<p>A Subgraph (in the Graph ecosystem sense) is typically defined by three\u00a0pieces:<\/p>\n<p>subgraph.yaml: which contracts + events to index and how to map\u00a0themschema.graphql: the entity model you want to\u00a0querymapping code: handler logic (often AssemblyScript) that writes entities as events\u00a0arrive<\/p>\n<p>One detail that\u2019s easy to forget until you go multichain: <strong>a single subgraph can index multiple contracts, but not multiple networks<\/strong>. <br \/>So what many teams did in practice was run <em>N<\/em> near-identical subgraphs per chain\u2026 and then stitch results together in the\u00a0app.<\/p>\n<p>Alchemy\u2019s hosted Subgraphs product made that pattern feel \u201csolved\u201d until it wasn\u2019t. Their deprecation notice is blunt: service sunset on Dec 8, 2025; endpoints discontinued; they pointed users to migrate to Goldsky to keep using subgraphs.<\/p>\n<p>That\u2019s the key \u201cpost-subgraph\u201d shift: builders started treating the indexing layer like any other critical backend dependency\u200a\u2014\u200asomething you design for <strong>portability, observability, migration, rollback, and\u00a0cost<\/strong><\/p>\n<p><strong>Your indexer is part of your backend contract.<\/strong><br \/>Envio\u2019s description of indexers matches the real-world use: ingest blocks\/tx\/logs \u2192 apply deterministic logic \u2192 store structured entities that your backend can rely on. <br \/>When that layer disappears, every downstream service (alerts, dashboards, bots, portfolio views) gets weird\u00a0fast.<\/p>\n<p><strong>Portability is about more than \u201ccan I redeploy the YAML.\u201d<\/strong><br \/>A migration isn\u2019t just subgraph.yaml \u2192 something else. It\u2019s\u00a0also:<\/p>\n<p>schema compatibility (\u201cnear copy paste\u201d is the\u00a0dream)handler language\/runtime differences (AssemblyScript vs TypeScript\/JS\/ReScript)query semantics (Graph Node\u2019s custom query conventions vs standard GraphQL\u00a0engines)<\/p>\n<p>Envio leans into this by explicitly documenting migration steps and by providing conversion tooling for queries when you can\u2019t update every client immediately.<\/p>\n<p><strong>Multichain is a product feature, not \u201cextra deployments.\u201d<\/strong><br \/>Envio\u2019s HyperIndex is built around <strong>multichain indexing inside a single indexer<\/strong>, with config patterns that define a contract once and list network-specific deployments under networks. <br \/>That\u2019s not just elegance. It reduces operational surface area: fewer deployments, fewer drift bugs, fewer \u201cwhy is Arbitrum behind Base?\u201d incidents.<\/p>\n<p><strong>Event volume is your enemy unless you filter ruthlessly.<\/strong><br \/>In post-subgraph land, teams became more intentional about <em>which<\/em> events they index. Envio\u2019s documentation highlights two especially useful primitives for\u00a0this:<\/p>\n<p><strong>Wildcard indexing<\/strong>: index events by signature without needing a specific contract address; useful for standards like ERC\u201120 transfers<strong>Topic filtering<\/strong>: restrict wildcard events by indexed parameters (e.g., only transfers to\/from a watchlist)<\/p>\n<p>That combination is basically \u201cbuild a trader feed without drowning in chain\u00a0noise.\u201d<\/p>\n<p><strong>Reorgs and head latency are not theoretical.<\/strong><br \/>Envio exposes knobs like rollback_on_reorg (with performance tradeoffs) in the config schema reference. <br \/>And they have dedicated discussion around \u201clatency at the chain head,\u201d including how configuration like unordered multichain mode can keep other chains moving even if one chain gets\u00a0slow.<\/p>\n<p>A small but telling example: <a href=\"https:\/\/docs.envio.dev\/blog\/envio-developer-update-february-2026\">Envio\u2019s February 2026 update<\/a> says they removed an \u201cordered multichain mode\u201d because forcing global ordering across chains introduced latency and could allow one problematic chain to freeze the entire indexing process. <br \/>That\u2019s a very \u201cpost-subgraph\u201d kind of design decision: optimize for resilience and timeliness, and model cross-chain relationships explicitly instead of assuming a single global event\u00a0order.<\/p>\n<h3>Practical rebuild with Envio HyperIndex<\/h3>\n<p>Let\u2019s rebuild a very real \u201csubgraph era\u201d\u00a0feature:<\/p>\n<p>A <strong>token-flow feed<\/strong> that traders\/bots use to answer:<br \/>\u201cWhich wallets are suddenly receiving (or dumping) tokens right now\u200a\u2014\u200aacross multiple\u00a0chains?\u201d<\/p>\n<p>We\u2019ll build it as an indexer that captures ERC\u201120 Transfer events, but only if they involve a <strong>watchlist<\/strong> of addresses (exchange wallets, known whales, protocol vaults, whatever you care\u00a0about).<\/p>\n<p>This is a great demo because it lands for all audiences:<\/p>\n<p>Traders get a clean feed + leaderboards.Builders get a backend\u2011grade API.Infra folks see how to keep the blast radius\u00a0small.<\/p>\n<p>Envio explicitly positions HyperIndex as the indexing framework that turns events into structured DB + GraphQL APIs, and HyperSync as the fast data engine beneath it. <br \/>Their local development workflow uses Hasura as the GraphQL console\/UI.<\/p>\n<h3>Step zero: scaffold the\u00a0project<\/h3>\n<p>Envio\u2019s own tutorials use pnpx envio init, then generate the three core files: config.yaml, schema.graphql, and src\/EventHandlers.*.<\/p>\n<p>They recommend Node.js v22+, pnpm, and Docker Desktop for local\u00a0runs.<\/p>\n<p>When you start your indexer with pnpm dev, Envio\u2019s tutorial notes it will start Docker containers, set up the database, launch indexing, and open the Hasura GraphQL interface.<\/p>\n<h4>config.yaml<\/h4>\n<p>This is the \u201cpost-subgraph manifest.\u201d<br \/>In Envio, <strong>project configuration lives in <\/strong>config.yaml, and it defines networks, contracts, and events to\u00a0index.<\/p>\n<p>Below is an example that indexes ERC\u201120 transfers with wildcard mode, and runs across multiple networks (add\/remove networks to taste). The core idea is straight from Envio\u2019s wildcard indexing docs: define the Transfer event; enable wildcard in the handler registration; then\u00a0filter.<\/p>\n<p>Paste this as config.yaml:<\/p>\n<p><a href=\"https:\/\/medium.com\/media\/24c0177d96de6ebe3c923283cc8c88bd\/href\">https:\/\/medium.com\/media\/24c0177d96de6ebe3c923283cc8c88bd\/href<\/a><\/p>\n<p>Why unordered_multichain_mode?<br \/>Envio documents that unordered mode processes events as soon as they\u2019re available per chain (still ordered within a chain), avoids waiting for the slowest chain, and is recommended for most apps when cross-chain ordering doesn\u2019t matter. <br \/>They also describe the resilience angle: one laggy chain shouldn\u2019t freeze the\u00a0rest.<\/p>\n<h4>schema.graphql<\/h4>\n<p>Envio\u2019s docs are explicit: every entity type in schema.graphql maps to a database table, and HyperIndex generates a GraphQL API from\u00a0them.<\/p>\n<p>Keep the schema small and purposeful. For trader-grade UX, you usually\u00a0want:<\/p>\n<p>a raw \u201cTransfer\u201d row (for the\u00a0feed)an \u201cAddressStats\u201d row (for leaderboards and netflow summaries)<\/p>\n<p>Paste this as schema.graphql:<\/p>\n<p><a href=\"https:\/\/medium.com\/media\/83bfa13c756b016641d48cbb0b3a31e3\/href\">https:\/\/medium.com\/media\/83bfa13c756b016641d48cbb0b3a31e3\/href<\/a><\/p>\n<p>A couple small but important notes:<\/p>\n<p>Envio requires entities to have a unique id, and supports scalars like BigInt for Solidity-sized integers.You\u2019ll want <strong>chain\u2011namespaced IDs<\/strong> for multichain to avoid collisions; Envio even calls this out as a best practice (\u201cappend the chain ID to entity\u00a0IDs\u201d).<\/p>\n<h4>src\/EventHandlers.ts<\/h4>\n<p>Envio handlers are where \u201craw logs become app\u00a0state.\u201d<\/p>\n<p>Their handler docs show the core patterns you\u2019ll\u00a0use:<\/p>\n<p>context.Entity.get(&#8230;) \/ getOrCreate(&#8230;)context.Entity.set(&#8230;) to write\u00a0updates<\/p>\n<p>Their wildcard indexing doc shows the exact shape of a wildcard transfer handler (including { wildcard: true }) and then topic filtering with eventFilters.<\/p>\n<p>Paste this as src\/EventHandlers.ts:<\/p>\n<p><a href=\"https:\/\/medium.com\/media\/0c98f0f134fe7ce9a00aa73f4669a250\/href\">https:\/\/medium.com\/media\/0c98f0f134fe7ce9a00aa73f4669a250\/href<\/a><\/p>\n<p>Why this is \u201cpost-subgraph era\u201d\u00a0code:<\/p>\n<p>It\u2019s small enough that you actually own\u00a0it.It\u2019s explicit about <em>what you store<\/em> and\u00a0<em>why<\/em>.It treats multichain and address collisions as first-class concerns.<\/p>\n<h4>Optional upgrade: topic filtering to reduce load even\u00a0more<\/h4>\n<p>Wildcard indexing can pull a massive event volume across big chains. Envio\u2019s docs explicitly warn that indexing all ERC\u201120 transfers is \u201ca lot of events,\u201d and recommend topic filtering using eventFilters on indexed params (like from and\u00a0to).<\/p>\n<p>In practice, that means you can push filtering down closer to the log-selection layer, not just in your\u00a0handler.<\/p>\n<h3>Query it like a\u00a0trader<\/h3>\n<p>Locally, Envio uses Hasura as the GraphQL engine + UI, and documents that when running locally it\u2019s available at http:\/\/localhost:8080 with password\u00a0<a href=\"https:\/\/docs.envio.dev\/docs\/HyperIndex\/navigating-hasura\">testing.<\/a><\/p>\n<p>Here are two queries worth including.<\/p>\n<p><strong>Feed query:<\/strong> latest transfers involving watchlist<\/p>\n<p><a href=\"https:\/\/medium.com\/media\/5e2a8b42cf4d0b24eb2b2ff290449832\/href\">https:\/\/medium.com\/media\/5e2a8b42cf4d0b24eb2b2ff290449832\/href<\/a><\/p>\n<p><strong>Leaderboard query:<\/strong> who\u2019s receiving the most (in raw\u00a0units)<\/p>\n<p><a href=\"https:\/\/medium.com\/media\/808ff788cbac2dc019df3d308210dabb\/href\">https:\/\/medium.com\/media\/808ff788cbac2dc019df3d308210dabb\/href<\/a><\/p>\n<p>Alchemy\u2019s shutdown taught the ecosystem a pretty clean lesson: an indexer endpoint is not \u201cjust infra.\u201d It\u2019s <strong>product surface\u00a0area<\/strong>.<\/p>\n<p>Envio\u2019s docs (and the way HyperIndex is structured) map well onto what teams now\u00a0want:<\/p>\n<p>a clear config.yaml that defines the indexing\u00a0scopea schema.graphql that becomes real DB tables + a generated GraphQL\u00a0APIhandler code that looks like normal backend code (retrieve\/update entities with getOrCreate and\u00a0set)multichain that\u2019s not a pile of duplicated deploymentsevent-volume controls like wildcard + topic filtering for \u201ctrader feed\u201d workloadsdeployment that fits modern Git workflows (Envio Cloud describes a git-based flow like\u00a0Vercel)<\/p>\n<p>The biggest lesson from the \u201csubgraph era\u201d isn\u2019t that subgraphs were bad\u00a0, it\u2019s that <strong>Web3 outgrew\u00a0them<\/strong>.<\/p>\n<p>What worked for single-chain apps and simple queries doesn\u2019t hold up when you\u2019re dealing with <strong>multichain state, real-time analytics, and production-grade backends<\/strong>.<\/p>\n<p>Builders today don\u2019t just need indexed data.<br \/> They need <strong>fast backfills, unified schemas, and systems they actually\u00a0control<\/strong>.<\/p>\n<p>That\u2019s the real\u00a0shift.<\/p>\n<p>We\u2019re moving from <em>\u201cquerying blockchain data\u201d<\/em> \u2192 to <em>\u201cdesigning data systems on top of blockchains.\u201d<\/em><\/p>\n<p>And once you see indexers as part of your backend\u200a\u2014\u200anot just a tool\u200a\u2014\u200ayour entire architecture changes.<\/p>\n<p>So the next time you reach for a subgraph, ask yourself:<\/p>\n<p>\ud83d\udc49 <em>Am I just querying data\u2026 or building a\u00a0system?<\/em><\/p>\n<p>Because in this post-subgraph world, that difference matters.<\/p>\n<p>#web3 #blockchain #cryptodev #defi #programming #softwareengineering #opensource<\/p>\n<p><a href=\"https:\/\/medium.com\/coinmonks\/after-subgraphs-rethinking-web3-data-infrastructure-with-envio-a9b3e0c90e6c\">After Subgraphs: Rethinking Web3 Data Infrastructure with Envio<\/a> was originally published in <a href=\"https:\/\/medium.com\/coinmonks\">Coinmonks<\/a> on Medium, where people are continuing the conversation by highlighting and responding to this story.<\/p>","protected":false},"excerpt":{"rendered":"<p>The day your GraphQL endpoint\u00a0404s If you were building in the \u201cSubgraph Era,\u201d your backend often had one quiet dependency: a hosted GraphQL endpoint that turned messy, low\u2011level chain data into clean entities. Then on December 8, 2025, Alchemy Subgraphs was sunset and \u201call subgraph and query endpoints\u201d were discontinued. What a lot of teams [&hellip;]<\/p>\n","protected":false},"author":0,"featured_media":149082,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-149081","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-interesting"],"_links":{"self":[{"href":"https:\/\/mycryptomania.com\/index.php?rest_route=\/wp\/v2\/posts\/149081"}],"collection":[{"href":"https:\/\/mycryptomania.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mycryptomania.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/mycryptomania.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=149081"}],"version-history":[{"count":0,"href":"https:\/\/mycryptomania.com\/index.php?rest_route=\/wp\/v2\/posts\/149081\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/mycryptomania.com\/index.php?rest_route=\/wp\/v2\/media\/149082"}],"wp:attachment":[{"href":"https:\/\/mycryptomania.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=149081"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mycryptomania.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=149081"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mycryptomania.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=149081"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}