0% market fees. Bulk tools. Open source.
Grails is an open-source marketplace and manager for ENS names. It supports search and discovery, single and bulk listings/offers via Seaport, registration and renewal, profile and records management, on-chain activity, watchlists, leaderboards and chat — across Ethereum, Base and Optimism.
This repository is the web app. It is one of three components:
- App (this repo) — Next.js frontend at grails.app
- Backend — REST API and database — grailsmarket/backend
- Contracts — Solidity smart contracts — grailsmarket/contracts
- Next.js 15 (App Router, Turbopack) + React 19 + TypeScript
- Tailwind CSS 4
- wagmi + viem + RainbowKit for wallet/chain interactions
- @opensea/seaport-js for listings and offers
- TanStack Query for data fetching
- Redux Toolkit + redux-persist for client state
- Vercel OG + Puppeteer for dynamic preview images
- Bun 1.x (recommended) or Node.js 20+
- An EVM wallet for testing (MetaMask, Rainbow, Coinbase Wallet, etc.)
git clone https://github.com/grailsmarket/app.git
cd app
bun install
cp .env.example .env.local
# fill in the values in .env.local (see below)
bun run devOpen http://localhost:3000.
| Command | Description |
|---|---|
bun run dev |
Start the dev server (Turbopack) |
bun run build |
Production build |
bun run start |
Run the production build |
bun run lint |
ESLint |
bun run typecheck |
TypeScript check |
bun run format |
Prettier |
bun run checks |
Format + lint + typecheck |
Copy .env.example to .env.local and fill in the values. Variables prefixed with NEXT_PUBLIC_ are exposed to the browser.
| Variable | Required | Description |
|---|---|---|
NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID |
yes | WalletConnect Cloud project ID for client-side connections |
WALLET_CONNECT_PROJECT_ID |
yes | Same value, used server-side |
NEXT_PUBLIC_QUICKNODE_ID |
recommended | QuickNode endpoint ID (fallback RPC across all chains) |
NEXT_PUBLIC_MAINNET_ALCHEMY_ID |
recommended | Alchemy app key for Ethereum mainnet |
NEXT_PUBLIC_SEPOLIA_ALCHEMY_ID |
optional | Alchemy app key for Sepolia |
NEXT_PUBLIC_BASE_ALCHEMY_ID |
recommended | Alchemy app key for Base |
NEXT_PUBLIC_BASE_SEPOLIA_ALCHEMY_ID |
optional | Alchemy app key for Base Sepolia |
NEXT_PUBLIC_OPTIMISM_ALCHEMY_ID |
recommended | Alchemy app key for Optimism |
NEXT_PUBLIC_OP_SEPOLIA_ALCHEMY_ID |
optional | Alchemy app key for Optimism Sepolia |
Public RPCs are used as a final fallback, but reliable Alchemy / QuickNode keys are strongly recommended.
| Variable | Required | Description |
|---|---|---|
OPENSEA_API_KEY |
yes | Server-side OpenSea API key |
NEXT_PUBLIC_OPENSEA_API_KEY |
yes | Client-side OpenSea API key |
NEXT_PUBLIC_OPENSEA_API_URL |
yes | OpenSea API base URL (e.g. https://api.opensea.io) |
NEXT_PUBLIC_USE_CONDUIT |
optional | Set to true to route Seaport orders through the Grails conduit |
| Variable | Required | Description |
|---|---|---|
ENS_METADATA_URL |
optional | Base URL of the ENS metadata service |
ENS_METADATA_CACHE_INVALIDATION_TOKEN |
optional | Token used to bust the metadata cache |
| Variable | Required | Description |
|---|---|---|
NODE_ENV |
yes | development or production |
NODE_OPTIONS |
optional | Defaults to --no-warnings |
CHROMIUM_LOCAL_EXEC_PATH |
optional | Local Chromium path for OG-image rendering in dev |
NEXT_PUBLIC_CAN_CLAIM_POAP |
optional | Feature flag for POAP claim UI |
src/
api/ HTTP clients for the Grails backend
app/ Next.js App Router routes, layouts, and API routes
components/ Shared UI (navigation, modals, filters, chat, ...)
constants/ Chain, contract, and app-wide constants
context/ React context providers
hooks/ Reusable hooks
lib/ Wagmi config, Seaport client, metadata
state/ Redux store and slices
types/ Shared TypeScript types
utils/ Helpers (formatting, web3, etc.)
public/ Static assets (logos, icons, OG previews)
| Repo | Purpose |
|---|---|
| grailsmarket/app | This Next.js frontend |
| grailsmarket/backend | REST API and Postgres database powering listings, offers, activity, chat, search and analytics |
| grailsmarket/contracts | Solidity smart contracts (Seaport conduit, registration helpers, on-chain logic) |
Issues and pull requests are welcome. Run bun run checks before opening a PR.
MIT © Grails: ENS Market & Manager