A streamlined, open-source version of the block explorer experience at evm.now — a simple UI for looking up verified EVM contracts, inspecting their metadata and source, and calling read/write functions directly from the browser. Chain ID and RPC are configurable per-user and stored locally, so the same build works against any EVM network.
This repo ships two packages:
@evmnow/dapp— the Nuxt app behind evm.now (published as versioned GitHub releases, not to npm).@evmnow/contract-reader— the reusable pieces powering the dapp as a Nuxt layer: Vue components, composables, and utilities for rendering ABIs, decoding inputs/outputs, resolving ENS/GNS/WNS names, and wiring up read and write calls via viem and wagmi. Extend it from another Nuxt project to drop a contract UI into your own app.
We believe EVM contracts deserve a simple, open UI that lets users interact with them permissionlessly. This is the foundation — alongside the contract-metadata standard and SDK we're building to power better UX across the ecosystem.
pnpm install
pnpm devUseful commands:
pnpm typecheck
pnpm build
pnpm generateThe app has a Settings page for the reader RPC and chain ID. Both values are stored locally in your browser.
You can seed them with public Nuxt env vars:
NUXT_PUBLIC_DEFAULT_CHAIN_ID=1
NUXT_PUBLIC_DEFAULT_RPC=https://rpc.example.orgNUXT_PUBLIC_MAINNET_ENS_RPC can be set when you want a dedicated Ethereum mainnet RPC for .eth, .gwei, and .wei name resolution. The environment variable keeps its established name for compatibility.
Links can pass an RPC endpoint with the dappspec query parameter ds-rpc-<chainId>:
https://evmnow.eth.link/?ds-rpc-1=https%3A%2F%2Frpc.example.org
The override takes priority over saved settings for the session and is never stored. When several ds-rpc-* parameters are present, the one matching the selected chain wins, falling back to the first. A ds-rpc-1 endpoint is also used for ENS, GNS, and WNS resolution.
packages/dappis the Nuxt app.packages/contract-readeris the publishable library of shared contract UI components (@evmnow/contract-readeron npm).
Install in another Nuxt project:
pnpm add @evmnow/contract-readerThen extend it in nuxt.config.ts:
export default defineNuxtConfig({
extends: ['@evmnow/contract-reader'],
})Components, types, utils, and composables are also importable directly — e.g. @evmnow/contract-reader/components/Function/Cards, @evmnow/contract-reader/utils/contract.
Releases are managed with changesets.
- Add a changeset for your changes:
Pick the affected packages and a bump type. Commit the resulting
pnpm changeset
.changeset/*.mdfile with your PR. - On merge to
main, the Release workflow opens (or updates) a "Version Packages" PR that bumps versions and writes CHANGELOGs. - Merging that PR triggers the workflow again, which:
- publishes
@evmnow/contract-readerto npm; - creates a
@evmnow/dapp@x.y.zGitHub release for the dapp (private, not published).
- publishes
MIT © 1001.digital