A complete local blockchain development environment for Hathor Network. Think Ganache, but for Hathor.
- One-Click Fullnode - Start a local Hathor node with a pre-funded development wallet
- Integrated CPU Miner - Mine blocks instantly for testing with real-time hash rate display
- Multi-Wallet Support - Create and manage multiple wallets via the wallet-headless service
- Built-in Faucet - Send HTR from the fullnode's wallet to any address
- Block Explorer - Embedded explorer to browse blocks, transactions, and addresses
- Real-Time Dashboard - Monitor block height, hash rate, and service status
- MCP Server - AI integration allowing Claude to control the entire environment
- Zero Configuration - Works out of the box with sensible defaults
The app provides a clean dashboard with:
- Node and miner status indicators
- Block height and hash rate display
- Wallet management with Fund, Seed, and Close actions
- Built-in faucet for sending HTR
- Log viewer with filtering by service
- Block and transaction explorer
| Component | Technology |
|---|---|
| Desktop App | Tauri 2.x (Rust backend, ~10MB) |
| Frontend | React 18 + TypeScript + Tailwind CSS |
| Fullnode | hathor-core (Python, PyInstaller bundle) |
| Miner | cpuminer (C, SHA256d) |
| Wallet Service | wallet-headless (Node.js) |
| MCP Server | Embedded in Rust (Axum HTTP server) |
Run the CLI directly with Nix β no clone or install needed:
# Start MCP server only (control services via MCP tools)
nix run github:HathorNetwork/hathor-forge
# Start all local services (node + miner + wallet-headless + MCP)
nix run github:HathorNetwork/hathor-forge -- --start
# Start only wallet-headless pointing to an external node
nix run github:HathorNetwork/hathor-forge -- --wallet-only --fullnode-url http://mynode:8080
# Start without the miner
nix run github:HathorNetwork/hathor-forge -- --start --no-miner
# Save your preferred configuration
nix run github:HathorNetwork/hathor-forge -- --start --no-miner --save-settings
# Next time, just run without flags β settings are loaded from ~/.config/hathor-forge/cli-settings.json
nix run github:HathorNetwork/hathor-forge| Flag | Description |
|---|---|
--start |
Auto-start all local services |
--wallet-only |
Start only wallet-headless + MCP server |
--no-miner |
Skip starting the CPU miner |
--no-wallet |
Skip starting wallet-headless |
--no-tx-mining |
Skip starting tx-mining-service |
--fullnode-url <URL> |
Connect to an external fullnode (skip local node) |
--tx-mining-url <URL> |
Connect to an external tx-mining-service |
--mining-address <ADDR> |
Custom mining reward address |
--mcp-port <PORT> |
MCP server port (default: 9876) |
--save-settings |
Persist current flags to settings file |
--settings-file <PATH> |
Custom settings file path |
# With cargo (no Tauri dependency)
cargo build --manifest-path src-tauri/Cargo.toml --no-default-features --bin hathor-forge-cli
# With Nix
nix build .#hathor-forge-cli- Node.js 18+
- Rust 1.70+ (for Tauri)
- Nix (recommended) or manual dependency management
# Enter dev shell (auto-loads with direnv, or run manually)
nix develop
# Install npm dependencies
npm install
# Start development server
dev-serverBefore running the app, build the required binaries:
# Build hathor-core standalone binary
build-core
# Build cpuminer binary
build-cpuminer
# Build wallet-headless for multi-wallet support
build-wallet-headless
# Build hathor-explorer for embedded explorer
build-explorerbuild-releaseβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β HATHOR FORGE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β React Frontend (port 1420 in dev) β
β ββ Dashboard with real-time stats β
β ββ Wallet Manager (create, fund, view balances) β
β ββ Block & Transaction Explorer β
β ββ Log Viewer (filterable by service) β
β ββ Faucet UI for sending HTR β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Tauri Backend (Rust) β
β ββ Process management (node, miner, wallet-headless) β
β ββ Event streaming via Tauri events β
β ββ HTTP proxy for fullnode API β
β ββ Embedded MCP server (port 9876) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Services β
β ββ hathor-core (fullnode, port 8080 API, port 8000 stratum) β
β ββ cpuminer (connects to stratum) β
β ββ wallet-headless (port 8001, multi-wallet management) β
β ββ explorer-server (port 3001, embedded block explorer) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| Service | Port | Description |
|---|---|---|
| Fullnode API | 8080 | Hathor node REST API (/v1a/) |
| Stratum | 8000 | Mining stratum protocol |
| Wallet Headless | 8001 | Multi-wallet REST API |
| Explorer | 3001 | Block explorer web UI |
| MCP Server | 9876 | AI integration endpoint |
| Dev Server | 1420 | Vite dev server (development only) |
The fullnode runs with a pre-configured HD wallet that receives all mining rewards:
Seed: avocado spot town typical traffic vault danger century property shallow divorce festival spend attack anchor afford rotate green audit adjust fade wagon depart level
Default address: WXkMhVgRVmTXTVh47wauPKm1xcrW8Qf3Vb
Warning: This is a development-only wallet. Never use on mainnet or testnet.
The wallet-headless service enables creating multiple wallets:
- Click "Start Service" in the Wallet tab
- Click "New Wallet" to create a wallet (generates a new seed)
- Use "Fund" to send HTR from the faucet
- Use "Seed" to copy the wallet's seed phrase
- Use "Expand" to view addresses and send transactions
Hathor Forge includes an embedded MCP (Model Context Protocol) server that allows AI assistants like Claude to fully control the development environment.
Start the CLI (or desktop app), then add the MCP server:
# In one terminal: start the environment
nix run github:HathorNetwork/hathor-forge -- --start
# In another terminal: register the MCP server with Claude Code
claude mcp add --transport http hathor-forge http://127.0.0.1:9876/mcpOr add manually to your project's .mcp.json:
{
"mcpServers": {
"hathor-forge": {
"type": "http",
"url": "http://127.0.0.1:9876/mcp"
}
}
}| Category | Tools | Description |
|---|---|---|
| Node | start_node, stop_node, get_node_status |
Control the fullnode |
| Miner | start_miner, stop_miner, get_miner_status |
Control CPU mining |
| Wallet Service | start_wallet_service, stop_wallet_service, get_wallet_service_status |
Control wallet-headless |
| Wallets | generate_seed, create_wallet, get_wallet_seed, get_wallet_status, get_wallet_balance, get_wallet_addresses, send_from_wallet, close_wallet |
Manage multiple wallets |
| Faucet | get_faucet_balance, send_from_faucet, fund_wallet |
Send HTR from fullnode wallet |
| Blockchain | get_blocks, get_transaction |
Query blockchain data |
| Utilities | quick_start, quick_stop, get_full_status, reset_data |
Convenience commands |
Once configured, Claude can:
You: "Start the blockchain and create a test wallet with 50 HTR"
Claude: [Uses quick_start, create_wallet, fund_wallet tools]
"Done! Node is running at block height 45, miner is active.
Created wallet 'test' with 50 HTR. Seed: ..."
You: "Send 10 HTR to Wabc123..."
Claude: [Uses send_from_faucet tool]
"Sent 10 HTR. Transaction: 6883215..."
# Health check
curl http://127.0.0.1:9876/health
# Quick start everything
curl -X POST http://127.0.0.1:9876/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"quick_start","arguments":{}}}'
# Get full status
curl -X POST http://127.0.0.1:9876/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"get_full_status","arguments":{}}}'The fullnode runs with these flags for optimal local development:
| Flag | Purpose |
|---|---|
--localnet |
Uses localnet genesis with fast block times |
--stratum 8000 |
Enables stratum mining protocol |
--status 8080 |
REST API port |
--allow-mining-without-peers |
Enables solo mining |
--test-mode-tx-weight |
Reduced transaction weight for fast testing |
--wallet-enable-api |
Enables wallet REST endpoints |
--wallet-index |
Indexes wallet transactions |
--unsafe-mode privatenet |
Disables security checks for local dev |
# Node status
GET http://127.0.0.1:8080/v1a/status
# Wallet balance
GET http://127.0.0.1:8080/v1a/wallet/balance
# Wallet address
GET http://127.0.0.1:8080/v1a/wallet/address
# Send transaction
POST http://127.0.0.1:8080/v1a/wallet/send_tokens/
Content-Type: application/json
{"data": {"inputs": [], "outputs": [{"address": "W...", "value": 1000}]}}
# Get transaction
GET http://127.0.0.1:8080/v1a/transaction?id=<tx_hash>
# Get block at height
GET http://127.0.0.1:8080/v1a/block_at_height?height=<n># Start a wallet
POST http://127.0.0.1:8001/start
Content-Type: application/json
{"wallet-id": "my-wallet", "seed": "24 word seed..."}
# Get wallet status (X-Wallet-Id header required)
GET http://127.0.0.1:8001/wallet/status
# Get balance
GET http://127.0.0.1:8001/wallet/balance
# Get addresses
GET http://127.0.0.1:8001/wallet/addresses
# Send transaction
POST http://127.0.0.1:8001/wallet/simple-send-tx
{"address": "W...", "value": 1000}
# Stop wallet
POST http://127.0.0.1:8001/wallet/stophathor-dev-env/
βββ src/ # React frontend
β βββ App.tsx # Main application component
β βββ main.tsx # Entry point
β βββ index.css # Tailwind styles
βββ src-tauri/
β βββ src/
β β βββ lib.rs # Shared backend (process management, state)
β β βββ mcp.rs # Embedded MCP server
β β βββ cli_main.rs # CLI entry point (headless mode)
β β βββ tauri_app.rs # Tauri GUI commands and desktop entry point
β βββ binaries/ # Bundled executables (gitignored)
β β βββ hathor-core-*/ # Fullnode binary (PyInstaller onedir)
β β βββ cpuminer-* # Miner binary
β βββ wallet-headless-dist/ # Wallet service (Node.js bundle)
β βββ explorer-dist/ # Block explorer (static build)
β βββ tauri.conf.json # Tauri configuration
βββ scripts/
β βββ build-hathor-core.sh # Build fullnode binary
β βββ build-cpuminer.sh # Build miner binary
β βββ build-wallet-headless.sh # Build wallet service
β βββ build-explorer.sh # Build block explorer
βββ flake.nix # Nix development environment
βββ package.json # Node.js dependencies
- Check if ports 8080 or 8000 are already in use
- Try
reset_datato clear blockchain data and start fresh
- Ensure the fullnode is fully synced (check block height is increasing)
- The wallet needs the node to be ready before it can sync
- Start the miner and wait for a few blocks to be mined
- Mining rewards need 1 block confirmation before they're spendable
- Ensure Hathor Forge app is running
- Check
http://127.0.0.1:9876/healthreturns "OK" - Verify MCP config is in
.mcp.json, notsettings.json
- Fork the repository
- Create a feature branch
- Make your changes
- Run
cargo checkandnpm run lint - Submit a pull request
MIT