GitPedia

Ethernal

Ethernal is a block explorer for EVM-based chains. In a few seconds, spin up a fully-featured explorer for your L1/L2 rollup/testnet. Compatible with Optimism, ZK, Anvil, Hardhat, Geth...

From tryethernal·Updated June 20, 2026·View on GitHub·

**Ethernal** is a powerful, open-source block explorer for EVM-based chains. Effortlessly explore, search, and analyze blockchain data—whether you use our hosted service or run your own private instance. The project is written primarily in JavaScript, distributed under the MIT License license, first published in 2021. Key topics include: anvil, block-explorer, blockchain, evm, geth.

Latest release: 5.17.230
June 20, 2026View Changelog →

Ethernal

Ethernal is a powerful, open-source block explorer for EVM-based chains. Effortlessly explore, search, and analyze blockchain data—whether you use our hosted service or run your own private instance.

License: MIT


🚀 Quick Start

Hosted Version


🏠 Self-Hosting Ethernal

⚠️ Beta Notice:

The self-hosted version of Ethernal is currently in beta. Some features may not work as expected or may be incomplete. If you encounter any issues, please consider opening an issue to help us improve the project. Your feedback is greatly appreciated!

Run your own Ethernal instance on your infrastructure, with full control over your data and configuration.

Prerequisites

Database: Ethernal uses PostgreSQL (TimescaleDB) as its database backend. This is automatically provided through Docker containers—no manual installation required.

1. Clone the Repository

bash
git clone https://github.com/tryethernal/ethernal.git cd ethernal git checkout $(git describe --tags --abbrev=0) # Makes sure that you are using the latest stable version

2. Start Ethernal (Automatic Setup)

Just run:

bash
make start
  • On first run, this will prompt you for your domain/IP and port, then generate all secrets and config files using generate-env-files.sh.
  • On subsequent runs, it will skip generation and simply start the services.
  • If you ever want to regenerate your environment/config files, you can run bash ./generate-env-files.sh manually.

Tip: All generated secrets and config files are automatically added to .gitignore for your safety.

3. Access Your Instance

After setup, you'll see a summary like:

==================== Ethernal Installation Complete! ====================

🌐  DNS Setup Reminder:
    Make sure to add an A record in your DNS provider:
    your-domain.com -> <your-server-ip-address>

🔗  Start here to setup your instance:
    http://your-domain-or-ip/setup

🐘  PostgreSQL Connection String:
    postgresql://<user>:<password>@<host>:<port>/<db>

📊  Bullboard Access (background jobs):
    http://your-domain-or-ip/bull
    Username: ethernal
    Password: <auto-generated>
=======================================================================

👉 Next step:

  • Open the setup link shown above in your browser.
  • This guided setup will help you create your admin user account and set up your first explorer quickly and easily.
  • Once complete, you'll be ready to start using Ethernal!

🌐 DNS Setup Reminder:

If you are using a custom domain (not an IP address), make sure to add an A record in your DNS provider:

your-domain.com -> <your-server-ip-address>

Replace <your-server-ip-address> with the actual public IP of your server. This is required for your domain to resolve correctly to your Ethernal instance.


📖 Documentation

Full documentation is available at doc.tryethernal.com.


📡 API

Ethernal exposes a powerful API for programmatic access to your blockchain data and explorer features.

  • API Documentation:
    • Full list of endpoints and usage examples: Ethernal API Reference
    • Note: Replace all instances of api.tryethernal.com in the documentation with your own server's domain or IP address.

You can use this API to:

  • Query blocks, transactions, contracts, logs, and more
  • Integrate Ethernal data into your own dashboards or tools
  • Automate explorer management (add/delete explorer, customise them, etc...)

If you need additional endpoints or have suggestions for improvements, pull requests and issues are welcome!


🛠️ Useful Makefile Commands

  • make start – Start or restart Ethernal (with env/config generation)
  • make stop – Stop and clean up all containers and networks
  • make update – Pull latest images and apply migrations/seeds
  • make nuke – Remove all containers, volumes, and generated config files (all data will be lost)
  • make info – Display connection details and setup URLs

⚙️ Configuration

All configuration files and environment variables are generated automatically during setup. For a default installation, you should not need to change any of these values.
If you want to customize advanced settings, you can edit the relevant files after the initial setup.

Below are the main configuration files and the variables they contain:


Backend Environment Variables (run/.env.prod)

VariableDescriptionDefault
ENCRYPTION_KEYKey used for data encryption-
ENCRYPTION_JWT_SECRETSecret for JWT token encryption-
SECRETApplication secret key-
CORS_DOMAINCORS allowed domains*
NODE_ENVNode environmentproduction
REDIS_URLRedis connection stringredis://redis:6379
DB_USERPostgreSQL usernamepostgres
DB_PASSWORDPostgreSQL password(random)
DB_NAMEPostgreSQL database nameethernal
DB_HOSTPostgreSQL host (via pgbouncer)pgbouncer
DB_PORTPostgreSQL port (via pgbouncer)5433
SOKETI_DEFAULT_APP_IDSoketi app iddefault-app
SOKETI_DEFAULT_APP_KEYSoketi app keyapp-key
SOKETI_DEFAULT_APP_SECRETSoketi app secret(random)
SOKETI_HOSTSoketi hostsoketi
SOKETI_PORTSoketi port6001
PM2_HOSTPM2 dashboard hostpm2:9090
PM2_SECRETPM2 dashboard secret(random)
BULLBOARD_USERNAMEUsername for Bull dashboardethernal
BULLBOARD_PASSWORDPassword for Bull dashboard(random)
APP_DOMAINYour domain or IP(set at setup)
FIREBASE_SIGNER_KEYFirebase signer key(random)
FIREBASE_SALT_SEPARATORFirebase salt separator(random)
FIREBASE_ROUNDSFirebase rounds8
FIREBASE_MEM_COSTFirebase memory cost14
APP_URLApplication URL(set at setup)
SELF_HOSTEDSelf-hosted flagtrue
PORTApplication port8888
DEFAULT_PLAN_SLUGDefault plan slugself-hosted

PM2 Environment Variables (pm2-server/.env.prod)

VariableDescriptionDefault
SECRETPM2 dashboard secret(random)
ETHERNAL_SECRETBackend secret(random)
PORTPM2 dashboard port9090
ETHERNAL_REDIS_URLRedis connection stringredis://redis:6379/0
ETHERNAL_HOSTBackend host URLhttp://backend:8888

PostgreSQL Environment Variables (.env.postgres.prod)

VariableDescriptionDefault
POSTGRES_HOSTPostgreSQL hostpostgres
POSTGRES_USERPostgreSQL usernamepostgres
POSTGRES_PASSWORDPostgreSQL password(random)
POSTGRES_DBPostgreSQL database nameethernal
POSTGRES_PORTPostgreSQL port5432

Soketi Environment Variables (.env.soketi.prod)

VariableDescriptionDefault
SOKETI_DEFAULT_APP_IDSoketi app iddefault-app
SOKETI_DEFAULT_APP_KEYSoketi app keyapp-key
SOKETI_DEFAULT_APP_SECRETSoketi app secret(random)
SOKETI_HOSTSoketi host0.0.0.0
SOKETI_PORTSoketi port6001

Docker Compose Environment Variables (.env.docker-compose.prod)

VariableDescriptionDefault
EXPOSED_PORTPublic HTTP port80 (or as set at setup)
EXPOSED_SSL_PORTPublic HTTPS port443 (or as set at setup)

Note:

  • All secrets and passwords are generated randomly for each installation.

  • For most users, there is no need to change these values after setup.

  • The production Docker Compose file is docker-compose.prod.yml. You should run it with the environment file like this:

    bash
    docker compose -f docker-compose.prod.yml --env-file .env.docker-compose.prod up -d

📝 Blog Pipeline

Ethernal's blog (tryethernal.com/blog) is powered by an automated trend-scanning pipeline that discovers what's happening in the Ethereum ecosystem and produces draft articles.

How it works

Sources (EIPs, ERCs, ethresear.ch, Magicians, arxiv)
  ↓  weekly scan
Classify into 12 topic clusters
  ↓
Score by weighted signals (ERC count, research posts, arxiv papers, Google Trends)
  ↓
Create draft cards on GitHub Project board
  ↓  every 2 days
Round-robin picker selects highest-scoring topic (skips clusters with active work)
  ↓
Claude CLI researches sources and drafts the article
  ↓
Article committed to develop with status: draft (invisible on site, deployed for preview)
  ↓  card link added to project board
Move card to "Published" in GitHub Project
  ↓  triggers workflow
Frontmatter updated to status: published → article goes live on next deploy

Board columns: Detected → Researched → Drafting → Published

Running the pipeline

bash
cd blog/pipeline npm ci # Scan sources and create/update project cards node index.js # Preview without creating cards node index.js --dry-run # Pick next topic for drafting node index.js --pick --dry-run

Automation

TriggerWhatWhere
Weekly (Mon 6am UTC)Scan sources, update scores.github/workflows/blog-trend-scan.yml
Every 2 days (8am UTC)Pick topic, research, draft to develop.github/workflows/blog-draft.yml
Card → PublishedUpdate frontmatter status: published.github/workflows/blog-publish.yml
Systemd timer (Hetzner)Same as draft workflow via Claude CLIblog/pipeline/draft.sh

🐞 Bug Reports

Found a bug? Please open an issue in this repo.


💖 Support Us

Support Ethernal's development by subscribing to a paid plan.

Note: The self-hosted version will display ads by default. Running these ads helps support ongoing development of Ethernal. Thank you for contributing to the project by keeping them enabled!


📬 Contact Us

We'd love to hear from you!


Happy exploring! 🚀

Contributors

Showing top 7 contributors by commit count.

View all contributors on GitHub →

This article is auto-generated from tryethernal/ethernal via the GitHub API.Last fetched: 6/21/2026